diff --git a/beat/web/reports/static/reports/app/app.js b/beat/web/reports/static/reports/app/app.js index 5372e9c8c8bf9c037c2ce764d85109c37a7d8e23..569fbec8bef5d28ad34bd09930343aa8ec04da6d 100644 --- a/beat/web/reports/static/reports/app/app.js +++ b/beat/web/reports/static/reports/app/app.js @@ -19,7 +19,7 @@ * You should have received a copy of the GNU Affero Public License along * with the BEAT platform. If not, see http://www.gnu.org/licenses/. */ -var app = angular.module('reportApp', ['ui.router']); +var app = angular.module('reportApp', ['ui.router', 'angular.filter']); app.config(function ($stateProvider, $urlRouterProvider){ diff --git a/beat/web/reports/static/reports/app/controllers/reportController.js b/beat/web/reports/static/reports/app/controllers/reportController.js index 751359cdbd305413a51cf5d87ceb661d8d831d37..e5acb779935a334c71a0acf89fe6f68b1abfc893 100644 --- a/beat/web/reports/static/reports/app/controllers/reportController.js +++ b/beat/web/reports/static/reports/app/controllers/reportController.js @@ -48,6 +48,11 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory $scope.floating_point_precision.selected = 10; $scope.report_algorithm_parameters = {}; $scope.report_algorithm_parameters_experiment = {}; + $scope.sorted_tables = []; //tables that were sorted + $scope.sorted_experiments_keys_tables = {}; + $scope.sorted_experiments_alias_keys_tables = {}; + $scope.sorted_experiments_keys_reverse = {}; + $scope.sorted_experiments_keys_tables_sortkey = {}; $scope.init = function(user, report_id, url_prefix, data_itemcontent_file, data_table_itemcontent_file) { @@ -190,6 +195,26 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory intersectBlocks(experiment_alias); algorithmParameters(experiment_alias); } + //sort experiments in case it's sorted + if(!(jQuery.isEmptyObject($scope.report.content.sorted_tables_experiments)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_alias_experiments)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_keys_reverse)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_sortkey))) + { + $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_experiments; + if($scope.report.status == "locked") + { + //special case for locked reports + $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_alias_experiments; + } + $scope.sorted_experiments_alias_keys_tables = $scope.report.content.sorted_tables_alias_experiments; + $scope.sorted_experiments_keys_reverse = $scope.report.content.sorted_tables_keys_reverse; + $scope.sorted_experiments_keys_tables_sortkey = $scope.report.content.sorted_tables_sortkey; + } + for(var i = 0; i < Object.keys($scope.sorted_experiments_keys_tables_sortkey).length; i++) + { + $scope.sorted_tables.push(Object.keys($scope.sorted_experiments_keys_tables_sortkey)[i]); + } }) } @@ -223,6 +248,28 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory intersectBlocks(experiment_alias); algorithmParameters(experiment_alias); } + + //sort experiments in case it's sorted + if(!(jQuery.isEmptyObject($scope.report.content.sorted_tables_experiments)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_alias_experiments)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_keys_reverse)) && + !(jQuery.isEmptyObject($scope.report.content.sorted_tables_sortkey))) + { + $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_experiments; + if($scope.report.status == "locked") + { + //special case for locked reports + $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_alias_experiments; + } + $scope.sorted_experiments_alias_keys_tables = $scope.report.content.sorted_tables_alias_experiments; + $scope.sorted_experiments_keys_reverse = $scope.report.content.sorted_tables_keys_reverse; + $scope.sorted_experiments_keys_tables_sortkey = $scope.report.content.sorted_tables_sortkey; + } + for(var i = 0; i < Object.keys($scope.sorted_experiments_keys_tables_sortkey).length; i++) + { + $scope.sorted_tables.push(Object.keys($scope.sorted_experiments_keys_tables_sortkey)[i]); + } + }) } @@ -467,4 +514,5 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory return result; } + }]); diff --git a/beat/web/reports/static/reports/app/directives/reportItemView.js b/beat/web/reports/static/reports/app/directives/reportItemView.js index b4f0c3a315f96265ea49b5d39cafdfa859c16221..9920cb50e1c5d0af9d1cfcc3def5f06e84c44ae5 100644 --- a/beat/web/reports/static/reports/app/directives/reportItemView.js +++ b/beat/web/reports/static/reports/app/directives/reportItemView.js @@ -98,6 +98,14 @@ app.directive("savereportitems", function($compile) }); savecontent["alias_experiments"] = alias_experiments; } + + if(!(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_reverse)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables_sortkey))) + { + savecontent["sorted_tables_experiments"] = scope.sorted_experiments_keys_tables; + savecontent["sorted_tables_alias_experiments"] = scope.sorted_experiments_alias_keys_tables; + savecontent["sorted_tables_keys_reverse"] = scope.sorted_experiments_keys_reverse; + savecontent["sorted_tables_sortkey"] = scope.sorted_experiments_keys_tables_sortkey; + } //call set report content from factory var mydict = {}; mydict["experiments"] = scope.report.experiments; @@ -1116,11 +1124,18 @@ app.directive("thecolumn",['$compile', function ($compile) { template: '{{itemValue}}', controller: ['$scope', function ($scope) { + var the_parent = $scope.$parent.$parent.$parent.$parent; var report_experiments = $scope.$parent.$parent.$parent.$parent.report_experiments; var report_experiments_alias = $scope.$parent.$parent.$parent.$parent.report_experiments_alias; var floating_point_precision = $scope.$parent.$parent.$parent.$parent.floating_point_precision; var report = $scope.$parent.$parent.$parent.report; var experiment_name = $scope.$parent.item; + + if(jQuery.isEmptyObject(report_experiments) || (report_experiments[experiment_name] == undefined)) + { + return + } + var analyzer_block = report_experiments[experiment_name].analyzer_block; var report_algorithm_parameters_experiment = $scope.$parent.$parent.$parent.$parent.report_algorithm_parameters_experiment; @@ -1226,8 +1241,8 @@ app.directive("thecolumn",['$compile', function ($compile) { } else { - var experiment_alias = report_experiments_alias[experiment_name]; - $scope.itemValue = experiment_alias; + var experiment_alias = report_experiments_alias[experiment_name]; + $scope.itemValue = experiment_alias; } }]//, //link: function(scope, element, attrs) @@ -1334,6 +1349,261 @@ app.directive("buttonsettings", function() }; }); +//Directive used to handle table settings click +app.directive("sortdata", function($compile) +{ + return { + link:function(scope, element, attrs) + { + element.bind("click", function() + { + var the_parent = scope.$parent.$parent.$parent.$parent; + var analyzer_block = undefined; + var report_experiments = the_parent.report_experiments; + var report = the_parent.report; + var table_id = attrs.sorttblid; //get table id + the_parent.sorted_tables.push(table_id); + + if(the_parent.sorted_experiments_keys_reverse[table_id] == undefined) + { + the_parent.sorted_experiments_keys_reverse[table_id] = true; + } + else + { + the_parent.sorted_experiments_keys_reverse[table_id] = !the_parent.sorted_experiments_keys_reverse[table_id]; + } + + the_parent.sorted_experiments_keys_tables_sortkey[table_id] = attrs.sortth; //set the sortKey to the param passed + + if(the_parent.sorted_experiments_keys_tables_sortkey[table_id] != "experiment") + { + var local_sort_list = []; + + if(analyzer_block == undefined) + { + angular.forEach(report_experiments, function(value, key) + { + angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) + { + if(value_analyzer.algorithm == report.analyzer && (key_analyzer in report_experiments[key].declaration.analyzers)) + { + report_experiments[key].analyzer_block = key_analyzer; + analyzer_block = report_experiments[key].analyzer_block; + } + }); + }); + } + + if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("execution_time.") == 0) + { + //execution time information + var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("execution_time.")[1].split("[s]")[0]; + angular.forEach(report_experiments, function(value, key) + { + var local_sort_dict = {}; + local_sort_dict["experiment"] = key; + var itemValue = ""; + + if(Object.keys(report_experiments[key].execution_info).length === 0) + { + itemValue = "-"; + } + else + { + if(report_experiments[key].execution_info[block_name] == undefined) + { + itemValue = "-"; + } + else + { + itemValue = (report_experiments[key].execution_info[block_name].linear_execution_time); + } + } + + local_sort_dict["value"] = itemValue; + local_sort_list.push(local_sort_dict); + }); + } + else if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("experiment.") == 0) + { + //total execution time information + var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("execution_time.")[1]; + var total_time = 0; + + angular.forEach(report_experiments, function(value, key) + { + var local_sort_dict = {}; + local_sort_dict["experiment"] = key; + var itemValue = ""; + + if(Object.keys(report_experiments[key].execution_info).length === 0) + { + total_time = "-"; + } + else + { + angular.forEach(report_experiments[key].execution_info, function(value, key) + { + total_time += value.linear_execution_time; + }); + } + + itemValue = total_time; + + local_sort_dict["value"] = itemValue; + local_sort_list.push(local_sort_dict); + }); + } + else if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("algorithm_parameter.") == 0) + { + //total execution time information + var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("algorithm_parameter.")[1]; + var algorithm_name = block_name.split("__")[0]; + var parameter_name = block_name.split("__")[1]; + + angular.forEach(report_experiments, function(value, key) + { + + var local_sort_dict = {}; + local_sort_dict["experiment"] = key; + var itemValue = ""; + + if(the_parent.report_algorithm_parameters_experiment[key][algorithm_name] != undefined) + { + var value = ""; + if(the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name] != undefined) + { + for(var i = 0; i < the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name].length; i++) + { + if(i > 0 && i < the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name].length -1 ) + { + value += ","; + } + value = the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name][i]; + } + } + else if(the_parent.report["all_experiments"][key]["declaration"]["globals"][algorithm_name][parameter_name] != undefined) + { + //get globals value + value = the_parent.report["all_experiments"][key]["declaration"]["globals"][algorithm_name][parameter_name]; + } + else + { + //nothing is defined + value = "-"; + } + + itemValue = value; + } + else + { + itemValue = "-"; + } + + local_sort_dict["value"] = itemValue; + local_sort_list.push(local_sort_dict); + }); + } + else + { + //results information + angular.forEach(report_experiments, function(value, key) + { + var local_sort_dict = {}; + local_sort_dict["experiment"] = key; + local_sort_dict["value"] = report_experiments[key].results[analyzer_block][the_parent.sorted_experiments_keys_tables_sortkey[table_id]].value; + + local_sort_list.push(local_sort_dict); + + }); + + } + + if(the_parent.sorted_experiments_keys_reverse[table_id]) + { + local_sort_list.sort(function(a, b) + { + return a.value > b.value; + }); + } + else + { + local_sort_list.sort(function(a, b) + { + return a.value < b.value; + }); + } + + the_parent.sorted_experiments_keys_tables[table_id] = []; + the_parent.sorted_experiments_alias_keys_tables[table_id] = []; + for(var i = 0; i < local_sort_list.length; i++) + { + the_parent.sorted_experiments_keys_tables[table_id].push(local_sort_list[i]["experiment"]); + if(the_parent.report.status == "editable") + { + the_parent.sorted_experiments_alias_keys_tables[table_id].push(the_parent.report_experiments_alias[local_sort_list[i]["experiment"]]); + } + } + + } + else + { + var experiments_aliases = []; + for(var i = 0; i < the_parent.report.experiments.length; i++) + { + var experiment_name = the_parent.report.experiments[i]; + var experiment_alias = the_parent.report_experiments_alias[experiment_name]; + experiments_aliases.push(experiment_alias); + } + if(the_parent.sorted_experiments_keys_reverse[table_id]) + { + experiments_aliases.sort(); + } + else + { + experiments_aliases.reverse(); + } + + the_parent.sorted_experiments_keys_tables[table_id] = []; + the_parent.sorted_experiments_alias_keys_tables[table_id] = []; + for(var i = 0; i < experiments_aliases.length; i++) + { + for(var the_experiment_key in the_parent.report_experiments_alias) + { + if(the_parent.report_experiments_alias[the_experiment_key] == experiments_aliases[i]) + { + the_parent.sorted_experiments_keys_tables[table_id].push(the_experiment_key); + if(the_parent.report.status == "editable") + { + the_parent.sorted_experiments_alias_keys_tables[table_id].push(the_parent.report_experiments_alias[the_experiment_key]); + } + } + + } + } + } + + var name_to_remove = "experiment"; + var tables_details = the_parent.tables_details[table_id]; + for(var i = 0; i < tables_details.length; i++) + { + if(tables_details[i].name == "experiment") + { + tables_details.splice(i,1); + break; + } + } + + var element = document.getElementById(table_id); + + $(element).attr('id', null); + $compile(element)(scope.$parent.$parent); + $(element).attr('id', table_id); + }); + } + }; +}); + //Directive used to handle table settings click app.directive("tableprecision", function($compile) { diff --git a/beat/web/reports/templates/reports/partials/reportSingleTable.html b/beat/web/reports/templates/reports/partials/reportSingleTable.html index 446ed234ba85c196d4c09dfb66f08c9a7ed02155..b1e3c168c755ce592823ff175f63fc6deb2080af 100644 --- a/beat/web/reports/templates/reports/partials/reportSingleTable.html +++ b/beat/web/reports/templates/reports/partials/reportSingleTable.html @@ -36,13 +36,17 @@ <table class="table table-hover table-striped table-condensed report-table"> <thead> <tr> - <th ng-repeat="(key, value) in tables_details[dattrs.tableid]" ng-if="value.selected" class="tableitemspace"> + <th ng-repeat="(key, value) in tables_details[dattrs.tableid]" ng-if="value.selected" class="tableitemspace" sortth="{$ value.name $}" sorttblid="{$ dattrs.tableid $}" sortdata> + <span ng-if="(sorted_tables | contains:dattrs.tableid)" class="glyphicon sort-icon" ng-show="sorted_experiments_keys_tables_sortkey[dattrs.tableid]==value.name" ng-class="{'glyphicon-chevron-up':sorted_experiments_keys_reverse[dattrs.tableid],'glyphicon-chevron-down':!(sorted_experiments_keys_reverse[dattrs.tableid])}"></span> + <span ng-if="!(sorted_tables | contains:dattrs.tableid) && sorted_experiments_keys_reverse[dattrs.tableid]!=undefined" class="glyphicon sort-icon" ng-show="sorted_experiments_keys_tables_sortkey[dattrs.tableid]==value.name" ng-class="{'glyphicon-chevron-up':sorted_experiments_keys_reverse[dattrs.tableid],'glyphicon-chevron-down':!(sorted_experiments_keys_reverse[dattrs.tableid])}"></span> {$ value.name $} </th> </tr> </thead> <tbody> - <tr ng-repeat="(exp_key, exp_val) in report_experiments" item="exp_key"> + <tr ng-if="!(sorted_tables | contains:dattrs.tableid)" ng-repeat="(exp_key, exp_val) in report_experiments" item="exp_key"> + <tr ng-if="(dattrs.reportstatus == 'editable' || dattrs.reportstatus == 'published') && sorted_tables | contains:dattrs.tableid" ng-repeat="(exp_key, exp_val) in sorted_experiments_keys_tables[dattrs.tableid]" item="exp_val"> + <tr ng-if="(dattrs.reportstatus == 'locked') && sorted_tables | contains:dattrs.tableid" ng-repeat="(exp_key, exp_val) in sorted_experiments_keys_tables[dattrs.tableid]" item="exp_val"> </tr> </tbody> </table> diff --git a/beat/web/reports/templates/reports/report.html b/beat/web/reports/templates/reports/report.html index 44463c09faff8ce3d138e2279df140815593377a..30a0da96b75384d4dc1820fa47db21b13d54ad92 100644 --- a/beat/web/reports/templates/reports/report.html +++ b/beat/web/reports/templates/reports/report.html @@ -57,9 +57,8 @@ <!-- Use Google's CDN for angular-js with a local fallback --> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script> <script>window.angular || document.write('<script src="{% fingerprint "angular/angular.min.js" %}"><\/script>');</script> - + <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.8/angular-filter.min.js"></script> <script src="{% fingerprint "angular-ui-router/release/angular-ui-router.min.js" %}" type="text/javascript" charset="utf-8"></script> - <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.core.min.js" %}" type="text/javascript" charset="utf-8"></script> <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.position.min.js" %}" type="text/javascript" charset="utf-8"></script> <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.widget.min.js" %}" type="text/javascript" charset="utf-8"></script> @@ -179,7 +178,6 @@ jQuery(document).ready(function() { xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken')); } }); - }); </script> diff --git a/beat/web/ui/static/ui/js/reportdialog.js b/beat/web/ui/static/ui/js/reportdialog.js index 4a206950d72f4b9d89ca0eb230ac749c36535fc3..c7efcf3461aad12012bf074e03bac034e96132ba 100644 --- a/beat/web/ui/static/ui/js/reportdialog.js +++ b/beat/web/ui/static/ui/js/reportdialog.js @@ -517,7 +517,6 @@ beat.ui.report.remove_item = function(dialog_id, elementToRemove, scope) beat.ui.report.report_saved = function(dialog_id, scope) { - console.log("ici"); var num_click = 0; // Create the dialog $('#' + dialog_id).dialog({