diff options
author | zsloan | 2020-11-24 16:14:20 -0600 |
---|---|---|
committer | zsloan | 2020-11-24 16:14:20 -0600 |
commit | 77dc4a4e7c68a10f9b7d743e02a0738cab870c68 (patch) | |
tree | 59a15ba30b62c8ee3eaca8c5aea3b0f6d5c09435 | |
parent | be315778db1d34f903312b5ac6bcc80dd848a5be (diff) | |
download | genenetwork2-77dc4a4e7c68a10f9b7d743e02a0738cab870c68.tar.gz |
- Fixed the "Block by Attribute Value" feature
- Changed the "Block by Attribute Value" feature and the "Filter by Value" feature to only work on columns that are numeric or have a small number of distinct values (respectively)
-rw-r--r-- | wqflask/wqflask/static/new/javascript/show_trait.js | 117 | ||||
-rw-r--r-- | wqflask/wqflask/templates/show_trait_transform_and_filter.html | 56 |
2 files changed, 123 insertions, 50 deletions
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index 3df8784e..87c35984 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -568,14 +568,29 @@ create_value_dropdown = function(value) { populate_sample_attributes_values_dropdown = function() { var attribute_info, key, sample_attributes, selected_attribute, value, _i, _len, _ref, _ref1, _results; $('#attribute_values').empty(); - sample_attributes = {}; - attr_keys = Object.keys(js_data.attributes).sort(); - for (i=0; i < attr_keys.length; i++) { - attribute_info = js_data.attributes[attr_keys[i]]; - sample_attributes[attribute_info.name] = attribute_info.distinct_values; - } - selected_attribute = $('#exclude_menu').val().replace("_", " "); - _ref1 = sample_attributes[selected_attribute]; + sample_attributes = []; + + var attributes_as_list = Object.keys(js_data.attributes).map(function(key) { + return [key, js_data.attributes[key].name]; + }); + + attributes_as_list.sort(function(first, second) { + if (second[1] > first[1]){ + return -1 + } + if (first[1] > second[1]){ + return 1 + } + return 0 + }); + + for (i=0; i < attributes_as_list.length; i++) { + attribute_info = js_data.attributes[attributes_as_list[i][0]] + sample_attributes.push(attribute_info.distinct_values); + } + + selected_attribute = $('#exclude_column').val() + _ref1 = sample_attributes[selected_attribute - 1]; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { value = _ref1[_i]; @@ -590,23 +605,35 @@ if (Object.keys(js_data.attributes).length){ populate_sample_attributes_values_dropdown(); } -$('#exclude_menu').change(populate_sample_attributes_values_dropdown); +$('#exclude_column').change(populate_sample_attributes_values_dropdown); block_by_attribute_value = function() { var attribute_name, cell_class, exclude_by_value; - attribute_name = $('#exclude_menu').val(); + + let exclude_group = $('#exclude_by_attr_group').val(); + let exclude_column = $('#exclude_column').val(); + + if (exclude_group === "other") { + var table_api = $('#samples_other').DataTable(); + } else { + var table_api = $('#samples_primary').DataTable(); + } + exclude_by_value = $('#attribute_values').val(); - cell_class = ".column_name-" + attribute_name; - return $(cell_class).each((function(_this) { - return function(index, element) { - var row; - if ($.trim($(element).text()) === exclude_by_value) { - row = $(element).parent('tr'); - return $(row).find(".trait-value-input").val("x"); - } - }; - })(this)); + + let val_nodes = table_api.column(3).nodes().to$(); + let exclude_val_nodes = table_api.column(attribute_start_pos + parseInt(exclude_column)).nodes().to$(); + + for (i = 0; i < exclude_val_nodes.length; i++) { + let this_col_value = exclude_val_nodes[i].childNodes[0].data; + let this_val_node = val_nodes[i].childNodes[0]; + + if (this_col_value == exclude_by_value){ + this_val_node.value = "x"; + } + } }; -$('#exclude_group').click(block_by_attribute_value); +$('#exclude_by_attr').click(block_by_attribute_value); + block_by_index = function() { var end_index, error, index, index_list, index_set, index_string, start_index, _i, _j, _k, _len, _len1, _ref; index_string = $('#remove_samples_field').val(); @@ -647,37 +674,57 @@ block_by_index = function() { filter_by_value = function() { let filter_logic = $('#filter_logic').val(); + let filter_column = $('#filter_column').val(); let filter_value = $('#filter_value').val(); + let block_group = $('#filter_group').val(); - block_group = $('#filter_group').val(); if (block_group === "other") { - table_api = $('#samples_other').DataTable(); + var table_api = $('#samples_other').DataTable(); } else { - table_api = $('#samples_primary').DataTable(); + var table_api = $('#samples_primary').DataTable(); } let val_nodes = table_api.column(3).nodes().to$(); - for (i = 0; i < val_nodes.length; i++) { - let this_node = val_nodes[i].childNodes[0]; - if(!isNaN(this_node.value) && !isNaN(filter_value)) { + if (filter_column == "value"){ + var filter_val_nodes = table_api.column(3).nodes().to$(); + } + else if (filter_column == "stderr"){ + var filter_val_nodes = table_api.column(5).nodes().to$(); + } + else if (!isNaN(filter_column)){ + var filter_val_nodes = table_api.column(attribute_start_pos + parseInt(filter_column)).nodes().to$(); + } + else { + return false + } + + for (i = 0; i < filter_val_nodes.length; i++) { + if (filter_column == "value" || filter_column == "stderr"){ + var this_col_value = filter_val_nodes[i].childNodes[0].value; + } else { + var this_col_value = filter_val_nodes[i].childNodes[0].data; + } + let this_val_node = val_nodes[i].childNodes[0]; + + if(!isNaN(this_col_value) && !isNaN(filter_value)) { if (filter_logic == "greater_than"){ - if (parseFloat(this_node.value) <= parseFloat(filter_value)){ - this_node.value = "x"; + if (parseFloat(this_col_value) <= parseFloat(filter_value)){ + this_val_node.value = "x"; } } else if (filter_logic == "less_than"){ - if (parseFloat(this_node.value) >= parseFloat(filter_value)){ - this_node.value = "x"; + if (parseFloat(this_col_value) >= parseFloat(filter_value)){ + this_val_node.value = "x"; } } else if (filter_logic == "greater_or_equal"){ - if (parseFloat(this_node.value) < parseFloat(filter_value)){ - this_node.value = "x"; + if (parseFloat(this_col_value) < parseFloat(filter_value)){ + this_val_node.value = "x"; } } else if (filter_logic == "less_or_equal"){ - if (parseFloat(this_node.value) > parseFloat(filter_value)){ - this_node.value = "x"; + if (parseFloat(this_col_value) > parseFloat(filter_value)){ + this_val_node.value = "x"; } } } diff --git a/wqflask/wqflask/templates/show_trait_transform_and_filter.html b/wqflask/wqflask/templates/show_trait_transform_and_filter.html index 22c52d8c..d7eac378 100644 --- a/wqflask/wqflask/templates/show_trait_transform_and_filter.html +++ b/wqflask/wqflask/templates/show_trait_transform_and_filter.html @@ -20,8 +20,48 @@ <div id="remove_samples_invalid" class="alert alert-error" style="display:none;"> Please check that your input is formatted correctly, e.g. <strong>3, 5-10, 12</strong> </div> + {% if sample_groups[0].attributes %} + <div class="input-append block-div-2"> + <label for="exclude_column">Block samples by group:</label> + <select id="exclude_column" size=1> + {% for attribute in sample_groups[0].attributes %} + {% if sample_groups[0].attributes[attribute].distinct_values|length <= 10 %} + <option value="{{ loop.index }}"> + {{ sample_groups[0].attributes[attribute].name }} + </option> + {% endif %} + {% endfor %} + </select> + <select id="attribute_values" size=1> + </select> + <select id="exclude_by_attr_group" size="1"> + <option value="primary"> + {{ sample_group_types['samples_primary'] }} + </option> + <option value="other"> + {{ sample_group_types['samples_other'] }} + </option> + </select> + <input type="button" id="exclude_by_attr" class="btn btn-danger" value="Block"> + </div> + {% endif %} <div id="filterMenuSpan" class="input-append block-div-2"> - <label for="filter_samples_field">Filter samples by value </label> + <label for="filter_samples_field">Filter samples by {% if not sample_groups[0].attributes %}value{% endif %} </label> + {% if sample_groups[0].attributes %} + <select id="filter_column"> + <option value="value">Value</option> + {% if js_data.se_exists %} + <option value="stderr">SE</option> + {% endif %} + {% for attribute in sample_groups[0].attributes %} + + <option value="{{ loop.index }}"> + {{ sample_groups[0].attributes[attribute].name }} + </option> + + {% endfor %} + </select> + {% endif %} <select id="filter_logic" size="1"> <option value="greater_than">></option> <option value="less_than"><</option> @@ -39,20 +79,6 @@ </select> <input type="button" id="filter_by_value" class="btn btn-danger" value="Filter"> </div> - {% if sample_groups[0].attributes %} - <div class="input-append block-div-2"> - <label for="exclude_menu">Block samples by group:</label> - <select id="exclude_menu" size=1> - {% for attribute in sample_groups[0].attributes %} - <option value="{{ sample_groups[0].attributes[attribute].name.replace(' ', '_') }}"> - {{ sample_groups[0].attributes[attribute].name }}</option> - {% endfor %} - </select> - <select id="attribute_values" size=1> - </select> - <input type="button" id="exclude_group" class="btn" value="Block"> - </div> - {% endif %} <div> <input type="button" id="hide_no_value" class="btn btn-default" value="Hide No Value"> <input type="button" id="block_outliers" class="btn btn-default" value="Block Outliers"> |