diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-05-14 16:12:21 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-06-17 13:21:28 +0200 |
commit | d9d5223d34083900b1eb66fcb4c70d3e23ae24d1 (patch) | |
tree | 634b407ea8c7b7b778c485744fcea9ac493f5541 /ishtar_common/static/js | |
parent | 60d7d9edb2fe286fd6c1cf47b6df04cdadcc8a7c (diff) | |
download | Ishtar-d9d5223d34083900b1eb66fcb4c70d3e23ae24d1.tar.bz2 Ishtar-d9d5223d34083900b1eb66fcb4c70d3e23ae24d1.zip |
Statistics - JS and templates to manage graphs and tables
Diffstat (limited to 'ishtar_common/static/js')
-rw-r--r-- | ishtar_common/static/js/ishtar-map.js | 35 | ||||
-rw-r--r-- | ishtar_common/static/js/ishtar.js | 279 |
2 files changed, 314 insertions, 0 deletions
diff --git a/ishtar_common/static/js/ishtar-map.js b/ishtar_common/static/js/ishtar-map.js index 1b0d4384b..a93813e61 100644 --- a/ishtar_common/static/js/ishtar-map.js +++ b/ishtar_common/static/js/ishtar-map.js @@ -27,6 +27,41 @@ var geolocation = {}; var geoloc_feature = {}; var geoloc_activated = {}; +var fetching_msg = "Fetching data..."; + +var _map_submit_search = function(query_vars, name, source){ + var modal_base_text = $('.modal-progress .modal-header').html(); + $('.modal-progress .modal-header').html(fetching_msg); + $('.modal-progress').modal('show'); + var data = search_get_query_data(query_vars, name); + var nb_select = jQuery("#id_" + name + "-length_map").val(); + if (!nb_select) nb_select = 10; + + var url = source + "json-map?length=" + nb_select + "&submited=1&" + data; + var use_map_limit = false; + if(data.indexOf("no_limit=true") == -1){ + url += "&limit=" + current_map_limit; + use_map_limit = true; + } + $.getJSON(url, function(data) { + var timestamp = Math.floor(Date.now() / 1000); + var map_id = "map-" + timestamp; + $('.modal-progress .modal-header').html("{% trans 'Render map...' %}"); + + var html = render_map(map_id, use_map_limit); + $("#tab-content-map-" + name).html(html); + $("#id_" + name + "-length_map").change(map_submit_search); + if ($('.modal-progress').length > 0){ + $('.modal-progress').modal('hide'); + $('.modal-progress .modal-header').html(modal_base_text); + } + register_map(map_id, data); + }); + + return false; + +}; + var geoloc_activated_message = function(map_id){ setTimeout(function(){ diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 2527c1bd7..54823968c 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -1095,6 +1095,33 @@ var get_hover_div = function(table_cols, data){ return hover; }; +var _gallery_submit_search = function(image_page, query_vars, name, source){ + if (image_page) { + current_image_page = image_page; + } else { + current_image_page = 1; + } + $('.modal-progress').modal('show'); + var data = search_get_query_data(query_vars, name); + var nb_select = jQuery("#id_" + name + "-length_image").val(); + if (!nb_select) nb_select = 10; + + var url = source + "json-image?length=" + nb_select + "&submited=1&" + data; + $.getJSON(url, function(data) { + var timestamp = Math.floor(Date.now() / 1000); + var gallery_id = "gallery-" + timestamp; + $("#tab-content-gallery-" + name).html( + render_gallery(data, name, nb_select, gallery_id)); + $("#id_" + name + "-length_image").change(gallery_submit_search); + register_image_gallery(gallery_id); + $('.card[data-toggle="tooltip"]').tooltip(); + if ($('.modal-progress').length > 0){ + $('.modal-progress').modal('hide'); + } + }); + return false; +} + var render_gallery = function(data_table, table_name, nb_select, gallery_id){ var html = '<div class="ishtar-gallery-wrapper container-fluid">'; html += render_paginate_select(table_name, 'image', nb_select); @@ -1343,6 +1370,7 @@ var register_map = function(map_id, points){ var main_submit_search = function(){ if (current_tab == "table") datatable_submit_search(); if (current_tab == "gallery") gallery_submit_search(); + if (current_tab == "stats") stats_submit_search(); if (current_tab == "map") map_submit_search(); }; @@ -1376,3 +1404,254 @@ var search_get_query_data = function(query_vars, table_name){ } return data; }; + +var registered_stats = false; + +var register_stats = function(query_vars, name, source){ + if (registered_stats) return; + registered_stats = true; + $("#stats-form-" + name + " select").on('change', function() { + _stats_submit_search(query_vars, name, source); + } + ); + $('#chart-img-display-' + name).click(function(){ + $('#chart-img-' + name).hide(); + $('#img-' + name).html( + $('<img/>').attr( + 'src', $('#chart-' + name).jqplotToImageStr({}) + ) + ); + $('#chart-img-' + name).show('slow'); + }); +}; + +var _stats_submit_search = function(query_vars, name, source){ + $('.modal-progress').modal('show'); + + var data = search_get_query_data(query_vars, name); + register_stats(query_vars, name, source); + + var url = source + "json-stats?submited=1&" + data; + var modality_1 = $("#stats_modality_1-" + name).val(); + if (modality_1) url += '&stats_modality_1=' + modality_1; + var modality_2 = $("#stats_modality_2-" + name).val(); + if (modality_2) url += '&stats_modality_2=' + modality_2; + $.getJSON(url, function(data) { + var timestamp = Math.floor(Date.now() / 1000); + var stats_id = "stats-" + timestamp; + $("#tab-content-stats-" + name).html( + render_stats(data, name)); + if ($('.modal-progress').length > 0){ + $('.modal-progress').modal('hide'); + } + }); + return false; +} + +var stats_showmarker = false; +var stats_incompatible_modality = "This graph type accept only one modality."; +var stats_current_graph; + +var _render_stats_table = function(stats_values, name){ + var modality_1 = $("#stats_modality_1-" + name).val(); + var modality_2 = $("#stats_modality_2-" + name).val(); + var rows = new Array(); + + var current_row = new Array(); + var html = ""; + html += "<table class='table w-75 mt-4 pt-4 mx-auto'><thead>"; + html += "<tr><th>"; + var modality_1_lbl = $('#stats_modality_1-' + name + ' option:selected').text(); + current_row.push(modality_1_lbl); + html += modality_1_lbl; + if (modality_2 && modality_2 != modality_1){ + html += "</th><th>"; + var modality_2_lbl = $('#stats_modality_2-' + name + ' option:selected').text(); + html += modality_2_lbl; + current_row.push(modality_2_lbl); + } + html += "</th><th>"; + var sum_lbl = $('#stats_sum-' + name + ' option:selected').text(); + html += sum_lbl; + current_row.push(sum_lbl); + html += "</th></tr></thead><tbody>"; + rows.push(current_row); + + if (modality_2 && modality_2 != modality_1){ + for (idx in stats_values){ + var start_row = ""; + row_content = ""; + for (inner_idx in stats_values[idx][1]){ + current_row = new Array(); + var colspan = parseInt(inner_idx) + 1; + start_row = "<tr><td rowspan='" + colspan + "'>" + stats_values[idx][0] + "</td>"; + current_row.push(stats_values[idx][0]); + if (inner_idx > 0) row_content += "<tr>"; + row_content += "<td>" + stats_values[idx][1][inner_idx][0] + "</td>"; + current_row.push(stats_values[idx][1][inner_idx][0]); + row_content += "<td>" + stats_values[idx][1][inner_idx][1] + "</td></tr>"; + current_row.push(stats_values[idx][1][inner_idx][1]); + rows.push(current_row); + } + html += start_row + row_content; + } + } else { + for (idx in stats_values){ + current_row = new Array(); + html += "<tr><td>" + stats_values[idx][0] + "</td>"; + current_row.push(stats_values[idx][0]); + html += "<td>" + stats_values[idx][1] + "</td></tr>"; + current_row.push(stats_values[idx][1]); + rows.push(current_row); + } + } + + html += "</tbody></table>"; + $("#charts-" + name).hide(); + $("#stats-table-content-" + name).html(html); + $("#stats-table-" + name).show(); + + var csv_content = "data:text/csv;charset=utf-8," + rows.map(e => e.join(",")).join("\n"); + var encoded_uri = encodeURI(csv_content); + $("#stats-table-csv-" + name).attr("href", encoded_uri); + $("#stats-table-csv-" + name).attr("download", "ishtar-stats.csv"); +}; + +var render_stats = function(stats_values, name){ + var stats_type = $("#stats_renderer-" + name).val(); + + if (!stats_values || !stats_values['data']) return; + stats_values = stats_values['data']; + + if (stats_current_graph){ + stats_current_graph.destroy(); + } + if (stats_type == "table"){ + return _render_stats_table(stats_values, name); + } + + $("#stats-table-" + name).hide(); + $("#charts-" + name).show(); + var modality_1 = $("#stats_modality_1-" + name).val(); + var modality_2 = $("#stats_modality_2-" + name).val(); + + stats_xaxis = { + label: $('#stats_modality_1-' + name + ' option:selected').text() + }; + + var stats_help = $("#stats-zoom-help-" + name); + + if (stats_type == "pie"){ + stats_help.hide(); + if (modality_2){ + display_info(stats_incompatible_modality); + return; + } + } else { + stats_help.show(); + var stats_xaxis_tickoptions; + if (modality_1 == "year"){ + stats_xaxis_tickoptions = {formatString: "%d"}; + } else { + stats_xaxis_tickoptions = {angle:-25}; + } + stats_xaxis["tickOptions"] = stats_xaxis_tickoptions + } + + var stats_showmarker = false; + if (stats_values.length < 25){ + stats_showmarker = true; + } + var jqvalues = new Array(); + var ticks = new Array(); + var series = new Array(); + var series_conf = new Array(); + if (modality_2 && modality_2 != modality_1){ + for (idx in stats_values){ + ticks.push(stats_values[idx][0]); + var serie_values = stats_values[idx][1]; + var current_serie_values = new Array(); + for (inner_idx in serie_values){ + var serie_value = serie_values[inner_idx][0]; + if (series.indexOf(serie_value) == -1){ + series.push(serie_value); + var fill_values = new Array(); + if (idx > 0){ // put 0 for previous items + for (var fill_idx = 0 ; fill_idx < idx ; fill_idx++ ){ + fill_values.push(0); + } + } + jqvalues.push(fill_values); + } + current_serie_values.push(serie_value); + var current_value = serie_values[inner_idx][1]; + jqvalues[series.indexOf(serie_value)].push(current_value); + } + // put 0 for missing series for this item + for (idx_serie in series){ + if (current_serie_values.indexOf(series[idx_serie]) == -1){ + jqvalues[series.indexOf(series[idx_serie])].push(0); + } + } + } + stats_xaxis['ticks'] = ticks; + } else { + jqvalues = [stats_values]; + series.push("Total"); + } + if (stats_type != "pie"){ + stats_xaxis['renderer'] = $.jqplot.CategoryAxisRenderer; + stats_xaxis['labelRenderer'] = $.jqplot.CanvasAxisLabelRenderer; + stats_xaxis['tickRenderer'] = $.jqplot.CanvasAxisTickRenderer; + } + + var stats_renderer; + if (stats_type == "bar"){ + stats_renderer = $.jqplot.BarRenderer; + } else if (stats_type == "pie"){ + stats_renderer = $.jqplot.PieRenderer; + } + for (idx in series){ + var serie_conf = { + label: series[idx], + showmarker: stats_showmarker + }; + if (stats_renderer){ + serie_conf["renderer"] = stats_renderer; + } + serie_conf["rendererOptions"] = { + padding: 8, showDataLabels: true, + dataLabels: 'value', + fill: false, sliceMargin: 4 + }; + series_conf.push(serie_conf); + } + + var stats_options = { + axes: { + xaxis: stats_xaxis, + yaxis: { + label: $('#stats_sum-' + name + ' option:selected').text(), + min: 0 + } + }, + highlighter: { + show: true, + tooltipAxes: 'y', + sizeAdjust: 7.5 + }, + series: series_conf, + legend: { show:true, location: 'e', placement: 'outside' } + }; + if (stats_type != "pie"){ + stats_options["cursor"] = { + show: true, + zoom: true, + showTooltip: false + } + } + + stats_current_graph = $.jqplot('chart-' + name, + jqvalues, stats_options + ); +}; |