diff --git a/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js b/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js index 27fb3e8bf5d3aab1efb7e80448d9530dd8305124..4e0144aa44792111d0615d7b5fb3c2732039b073 100644 --- a/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js +++ b/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js @@ -22,673 +22,774 @@ //Directive that returns an element which adds buttons on click which adds items var app = angular.module('plotterparameterApp'); -app.directive('loadedcontent', function() -{ - //return { - // link: function (scope, elem, attrs, ctrl) { - // angular.element(document).ready(function() { - // console.info(scope.report.content); - // - // }); - // //$(window).load(function() { - // // - // // console.info(scope.report.content); - // // - // // }); - // } - //} -}); +//valid code for now +//Directive used to plot a graph +app.directive("plotinfo", function(){ -//Directive for opening smart_selector list on "Add a report item" button click that displays options -app.directive("removeexperiment", function($compile) -{ - return function(scope, element, attrs) - { - //add new report item - element.bind("click", function() + return { + restrict: 'E', + scope: true, + replace: true, + //templateUrl: "/reports/partials/reportTable/", + templateUrl: function(scope, elem, attrs) { - removeExperiment(attrs.id); - }); - - - function removeExperiment(experiment_name) + var prefix = elem['urlprefix']; + var the_url = prefix + "/plotters/partials/plotinfo/"; + return the_url; + }, + link: function(scope, elem, attrs) { - beat.ui.report.remove_experiment('report_remove_experiment', experiment_name, scope); - } - } + console.log("--"); + console.log(scope.plotterparameter); + console.log("--"); + var data_to_plot = scope.plotters.selected.sample_data; + $('td#td_' + scope.plotterparameter.name).ready(function(){ + beat.experiments.utils.displayPlot( + scope.url_prefix, + $('td#td_figure_plot')[0], + { + output: scope.plotterparameter, + plotter: scope.plotters.selected.name, + parameter: scope.plotterparameter, + merged: true, + sample_data: scope.plotters.selected.sample_data, + }, + [scope.plotters.selected], // available plotters + true, // replace contents of tag above? + function(){$(this).find('i.fa-spin').hide();}); + }); + + }, + controller: ['$scope', function ($scope) { + }], + }; }); -//Directive for opening smart_selector list on "Add a report item" button click that displays options -app.directive("savereportitems", function($compile) +//Directive used to generate the selector for plotting graph +app.directive("selectplotter", function($compile) { - return function(scope, element, attrs) - { - //add new report item - element.bind("click", function() + return { + link:function(scope, element, attrs) { - //var savecontent = []; - var savecontent = {}; - if(scope.plots_details != undefined) - { - angular.forEach(scope.plots_details, function(value, key) - { - //savecontent.push(key, value); - savecontent[key] = value; - }); - } - if(scope.tables_details != undefined) - { - angular.forEach(scope.tables_details, function(value, key) - { - savecontent[key] = value; - //savecontent.push(key, value); - }); - - if(scope.floating_point_precision.selected != undefined) - { - savecontent["floating_point_precision"] = scope.floating_point_precision.selected; - } - } - if(scope.report_experiments_alias != undefined) + element.bind("change", function() { - var alias_experiments = {}; - angular.forEach(scope.report_experiments_alias, function(value, key) - { - alias_experiments[key] = value; - }); - savecontent["alias_experiments"] = alias_experiments; - } + var plotter_graph_element = document.getElementById('space-for-plotterparameter-graph'); + generate_graph(plotter_graph_element); - 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; - mydict["content"] = savecontent; + }); - for(var i = 0; i < scope.report.experiments.length; i++) + function generate_graph(head_id) { - scope.report_experiments_alias_from_content[scope.report.experiments[i]] = scope.report_experiments_alias[scope.report.experiments[i]]; + var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" + $(head_id ).empty(); + angular.element(head_id).append($compile(html_div_code)(scope)); } - updateReport(mydict); - }); - - - function updateReport(data) - { - scope.reportFactory.updateReport(scope.user, scope.report_id, data, scope.url_prefix) - .success(function (reportData) - { - //alert("The report "+ scope.report_id +" has been saved."); - - beat.ui.report.report_saved('report_saved', scope); - }) - .error(function (error) - { - scope.status = 'Unable to update report data: ' + error.message; - - }); - - } - } -}); - -//Directive for opening smart_selector list on "Add a report item" button click that displays options -app.directive("lockreport", function($compile) -{ - return function(scope, element, attrs) - { - //add new report item - element.bind("click", function() - { - lockReport(); - }); - - - function lockReport() - { - beat.ui.report.lock_report('report_lock', scope); } - } + }; }); -//Directive for opening smart_selector list on "Add a report item" button click that displays options -app.directive("publishreport", function($compile) +//Directive used to generate the selected plotting graph +app.directive("selectedplotter", function($compile) { - return function(scope, element, attrs) - { - //add new report item - element.bind("click", function() - { - publishReport(); - }); - - - function publishReport() + return { + link:function(scope, element, attrs) { - scope.reportFactory.publishReportAlgorithms(scope.user, scope.report_id, scope.url_prefix) - .success(function (reportData) - { - beat.ui.report.publish_report('report_publish', scope, reportData); - }) - .error(function (error) - { - scope.status = 'Unable to publish report data: ' + error; - $(".explanation_text").hide(); - $("#report_publish .warnings").hide(); - $("#report_publish .errors").show(); - if(error.detail != undefined) - scope.status = 'Unable to publish report data: ' + error.detail; - $("#report_publish .errors .errorslist").append(scope.status); - $("#button-report_publish-cancel").hide(); - }); + var plotter_graph_element = document.getElementById('space-for-plotterparameter-graph'); + generate_graph(plotter_graph_element); + function generate_graph(head_id) + { + var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" + $(head_id ).empty(); + angular.element(head_id).append($compile(html_div_code)(scope)); + } } - } + }; }); -//Directive for opening smart_selector list on "Add a report item" button click that displays options -app.directive("addreportitem", function($compile) +//Directive used to handle save plotterparameter click +app.directive("saveplotterparameter", function() { - return function(scope, element, attrs) - { - scope.$on("addSavedElement", function(event, id_content, type) + return { + link:function(scope, element, attrs) { - var num_tables_in_content = 0; - var num_figures_in_content = 0; - for(var i = 0; i < Object.keys(scope.report.content).length; i++) + element.bind("click", function() { - if(Object.keys(scope.report.content)[i].indexOf("table_") == 0) + //console.log(scope); + //console.log(element); + //console.log(attrs); + + //No plotter is selected + if(attrs.plotter == "None") { - num_tables_in_content++; + if($("#plotter-selection :selected").text().length == 0) + { + console.log("Please select a plotter first") + } + else + { + //console.log($("#plotter-selection").find(":selected").text()); + console.log(scope.plotters.selected); + scope.plotterparameterData.plotter = scope.plotters.selected.id; + + updatePlotterParameter(); + } } - else if(Object.keys(scope.report.content)[i].indexOf("chart_") == 0) + else { - num_figures_in_content++; + //plotter is selected: parameter tuning } - } + }); - if(type == "table") + function updatePlotterParameter() { - var table_id = id_content; - var table_details = undefined; - - //take the one with more elements - if(Object.keys(scope.tables_details).length > num_tables_in_content) - { - table_details = scope.tables_details[id_content]; - } - else - { - table_details = scope.report.content[id_content]; - } + console.log(scope.plotterparameterData); + scope.plotterparameterFactory.updatePlotterParameter(scope.user, scope.plotterparameter_user, scope.plotterparameter_name, scope.plotterparameter_version, scope.plotterparameterData, scope.url_prefix) + .success(function (reportData) + { + //alert("The report "+ scope.report_id +" has been saved."); - var name_to_remove = "experiment"; - for(var i = 0; i < table_details.length; i++) - { - if(table_details[i].name == "experiment") + beat.ui.plotterparameter.plotterparameter_saved('plotterparameter_saved', scope); + }) + .error(function (error) { - table_details.splice(i,1); - break; + scope.status = 'Unable to update plotterparameter data: ' + error.message; + + }); + + } + + } + }; +}); + +//Directive used to append parameters +app.directive("plotparams", function($compile){ + + return { + restrict: 'E', + scope: true, + replace: true, + //templateUrl: "/reports/partials/reportTable/", + templateUrl: function(scope, elem, attrs) + { + var prefix = elem['urlprefix']; + var the_url = prefix + "/plotters/partials/plotparamsinfo/"; + return the_url; + }, + link: function(scope, elem, attrs) + { + $('#table_plotparams tr:last').ready(function(){ + var params_from_plotter = scope.$parent.plotters.selected.declaration.parameters; + + //Iterate through each plotter parameters and add them + $.each(params_from_plotter, function( key, value ) { + + if(key != "content_type" ) + { + //index in table + var tag_id = (scope.textdata).indexOf(key); + var html_div_code = ''; + + var current_value = value.default; + if(key in scope.plotterparams_update) + { + current_value = scope.plotterparams_update[key]; + } + + if(value.type == "string") + { + console.log(value.default); + console.log(JSON.stringify(value.default)); + console.log(scope); + console.log("icicc"); + console.log("key:"); + console.log(key); + console.log("value:"); + console.log(value); + console.log("-----"); + + html_div_code = '<tr><td>'+ key +'</td><td><input id="tag_input_'+ key +'" class="form-control input-sm" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput></td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; + } + else if(value.type == "float64") + { + var minus_button_plus = '<div style="width:15em" class="input-group"><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="minus" buttonplusminus><button type="button" class="btn btn-danger btn-number" data-type="minus" data-field="quant[2]"><span class="glyphicon glyphicon-minus"></span></button></span><input style="text-align:center" id="tag_input_'+ key +'" class="form-control input-number" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="plus" buttonplusminus><button type="button" class="btn btn-success btn-number" data-type="plus" data-field="quant[2]"><span class="glyphicon glyphicon-plus"></span></button></span></div>'; + html_div_code = '<tr><td>'+ key +'</td><td>'+ minus_button_plus +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; + } + else if(value.type == "uint16") + { + var minus_button_plus = '<div style="width:15em" class="input-group"><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="minus" buttonplusminus><button type="button" class="btn btn-danger btn-number" data-type="minus" data-field="quant[2]"><span class="glyphicon glyphicon-minus"></span></button></span><input style="text-align:center" id="tag_input_'+ key +'" class="form-control input-number" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="plus" buttonplusminus><button type="button" class="btn btn-success btn-number" data-type="plus" data-field="quant[2]"><span class="glyphicon glyphicon-plus"></span></button></span></div>'; + html_div_code = '<tr><td>'+ key +'</td><td>'+ minus_button_plus +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; + } + else if(value.type == "bool") + { + var bool_param = ''; + if(current_value) + { + bool_param ='<fieldset class="toggle" id="tag_bool_'+ key +'" type="'+value.type+'" value="' + current_value + '" key="' + key + '" toggleparam><input id="data-policy_'+key+'" type="checkbox" checked="checked"><label for="data-policy"><div class="toggle-button"><div class="toggle-tab"></div></div></label></fieldset>'; + } + else + { + bool_param ='<fieldset class="toggle" id="tag_bool_'+ key +'" type="'+value.type+'" value="' + current_value + '" key="' + key + '" toggleparam><input id="data-policy_'+key+'" type="checkbox"><label for="data-policy"><div class="toggle-button"><div class="toggle-tab"></div></div></label></fieldset>'; + } + html_div_code = '<tr><td>'+ key +'</td><td>'+ bool_param +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; + + } + else + { + $('#table_plotparams > tbody:last-child').append('<tr><td>'+ key +'</td><td>'+value.default+'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'); + } + + angular.element('#table_plotparams > tbody:last-child').append($compile(html_div_code)(scope)); + } - } + }); - scope.tables_details[table_id] = table_details; - var accessnumber = "no_number"; - if(scope.report.number == scope.report_number) - { - accessnumber = "number"; - } - var html_div_code = '<div class="panel panel-default" id="' + table_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + table_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-table"> Table</i></a></h4></div><div id="collapse-' + table_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div class="panel-body" table-dynamic monster=' + scope.num_report_items + " tableid=" + table_id + " reportstatus=" + scope.report.status + " accessnumber=" + accessnumber + " urlprefix=" + scope.url_prefix + '></div></div></div>'; - angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); - if(parseInt(table_id.split("_").pop(-1)) >= scope.max_num) - { - scope.max_num = parseInt(table_id.split("_").pop(-1)); - scope.num_report_items = scope.max_num; - } - scope.num_report_items++; - } - else if(type == "chart") - { + }); - var content_detail = {}; - var chart_id = id_content; + //var data_to_plot = scope.plotters.selected.sample_data; + //$('td#td_' + scope.plotterparameter.name).ready(function(){ + // beat.experiments.utils.displayPlot( + // scope.url_prefix, + // $('td#td_figure_plot')[0], + // { + // output: scope.plotterparameter, + // plotter: scope.plotters.selected.name, + // parameter: scope.plotterparameter, + // merged: true, + // sample_data: scope.plotters.selected.sample_data, + // }, + // [scope.plotters.selected], // available plotters + // true, // replace contents of tag above? + // function(){$(this).find('i.fa-spin').hide();}); + //}); - var plot_details = undefined; + }, + controller: ['$scope', function ($scope) { + }], + }; +}); - //take the one with more elements - if(Object.keys(scope.plots_details).length > num_figures_in_content) - { - plot_details = scope.plots_details[chart_id]; - } - else - { - plot_details = scope.report.content[chart_id]; - } +//Directive used to handle textinput +app.directive("textinput", function() +{ + console.log("text changing?"); + return { + link:function(scope, element, attrs) + { + // on blur, update the value in scope + element.bind('propertychange keyup paste', function (blurEvent) { + console.log(scope); + console.log(element); + console.log(attrs); + var isValid = false; + if (element.data('old-value') != element.val()) { + console.log('value changed, new value is: ' + element.val()); - content_detail["name"] = plot_details.data.output[0]; - //content_detail["description"] = scope.report.content[chart_id].data.plotter; - if(plot_details.data.plotter != undefined) - { - content_detail["selected_plotter"] = plot_details.data.plotter; - } - if(plot_details.selected_template != undefined) - { - content_detail["selected_template"] = plot_details.selected_template; - } - if(plot_details.data.merged != undefined) - { - content_detail["merged"] = plot_details.data.merged; - } - if(plot_details.merged != undefined) - { - content_detail["merged"] = plot_details.merged; - } + var updateValue = element.val(); + //string check + if(attrs.type == "string") + { + isValid = true; + updateValue = element.val(); + } - var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + content_detail.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart {$ report.status $}"></div></div></div>'; - generate_element(scope, "plot", html_div_code); - var element = document.getElementById(chart_id); - var label_element = $(document.createElement('div')); - label_element.addClass('row'); + //integer check + else if(attrs.type == "uint16") + { + //convert value to integer + updateValue = parseInt(element.val()); + if(isNaN(updateValue)) + { + isValid = false; + alert("Entered value is not a integer"); + } + else + { + isValid = true; + updateValue = parseInt(element.val()); + } - var accessnumber = "no_number"; - if(scope.report.number == scope.report_number) - { - accessnumber = "number"; - } + } - var prepend_buttons = '<div class="col-sm-12"><div class="action-buttons report-buttons pull-left">'; - var append_buttons = '</div></div>'; + //float check + else if(attrs.type == "float64") + { + //convert value to float + updateValue = parseFloat(element.val()); + if(isNaN(updateValue)) + { + isValid = false; + alert("Entered value is not a float"); + } + else + { + isValid = true; + updateValue = parseFloat(element.val()); + } + } + //check if value is float + //updated models + if(isValid) + { + scope.plotterparams_update[attrs.key] = updateValue; + } + console.log(scope.plotterparams_update); - var a_export = '<div class="btn-group"><button type="button" class="btn btn-primary btn-sm dropdown-toggle item_export ' + scope.report.status + ' ' + accessnumber + '" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-download fa-lg"></i> Export Figure <span class="caret"></span></button><ul class="dropdown-menu"><li id="PNG" buttonexportitem><a>PNG</a></li><li id="JPEG" buttonexportitem><a>JPEG</a></li><li id="PDF" buttonexportitem><a>PDF</a></li></ul></div>'; - if(scope.report.status == "editable" && scope.report.number != scope.report_number) { - var a_element = '<button class="btn btn-danger btn-sm item_delete ' + scope.report.status + ' ' + accessnumber + '" buttondeleteitem><i class="fa fa-times fa-lg"></i> Delete</button>'; - label_element.html(prepend_buttons + a_element + a_export + append_buttons); - } - else { - label_element.html(prepend_buttons + a_export + append_buttons); + //scope.$apply(function () { + // scope.textdirective = element.val(); + // element.data('old-value', element.val()); + //}); } -; - $(element).find('.panel-body').append(label_element); - angular.element(document.getElementById('space-for-report-items')).append($compile(element)(scope)); - //var html_dropdown = "<chartdropdown id='selector_" + chart_id +"'></chartdropdown>"; - //angular.element(document.getElementById(chart_id)).append($compile(html_dropdown)(scope)); + }); - _retrieve_chart(scope, content_detail, element); + } + }; +}); - if(parseInt(chart_id.split("_").pop(-1)) >= scope.max_num) +//Directive used to handle bool toggle +app.directive("toggleparam", function() +{ + console.log("toggle pressed"); + return { + link:function(scope, element, attrs) + { + element.bind("click", function() + { + console.log("toggle pressed"); + console.log(scope); + console.log(element); + console.log(attrs); + + if($("#data-policy_"+attrs.key).prop("checked") == true) { - scope.max_num = parseInt(chart_id.split("_").pop(-1)); - scope.num_report_items = scope.max_num; + $("#data-policy_"+attrs.key).prop("checked", false); + } + else + { + $("#data-policy_"+attrs.key).prop("checked", true); } - scope.num_report_items++; - - } + scope.plotterparams_update[attrs.key] = $("#data-policy_"+attrs.key).prop("checked"); + console.log(scope.plotterparams_update); + }); } - ); + }; +}); - scope.$on("redrawGraphElement", function(event, id_content, type) +//Directive used to handle button plus/minus +app.directive("buttonplusminus", function() +{ + console.log("button +/- pressed"); + return { + link:function(scope, element, attrs) { - var content_detail = {}; - var chart_id = id_content; - content_detail["name"] = scope.report.content[chart_id].data.output[0]; - //content_detail["description"] = scope.report.content[chart_id].data.plotter; - if(scope.report.content[chart_id].data.plotter != undefined) - { - content_detail["selected_plotter"] = scope.report.content[chart_id].data.plotter; - } - if(scope.report.content[chart_id].data.parameter != undefined) - { - content_detail["selected_template"] = scope.report.content[chart_id].data.parameter; - } - if(scope.report.content[chart_id].data.merged != undefined) + element.bind("click", function() { - content_detail["merged"] = scope.report.content[chart_id].data.merged; - } + console.log("button +/- pressed"); + console.log(scope); + console.log(element); + console.log(attrs); + console.log(attrs.key); + var tomodify = $("#tag_input_"+attrs.key).val(); + console.log(tomodify); + if(attrs.type == "uint16") + { + tomodify = parseInt(tomodify); + if(attrs.action == "plus") + { + tomodify = tomodify +1; + } + else if(attrs.action == "minus") + { + tomodify = tomodify -1; + } + } + else if(attrs.type == "float64") + { + tomodify = parseFloat(tomodify); + if(attrs.action == "plus") + { + tomodify = tomodify +0.1; + } + else if(attrs.action == "minus") + { + tomodify = tomodify -0.1; + } + tomodify = tomodify.toFixed(1); + } + $("#tag_input_"+attrs.key).val(tomodify); + scope.plotterparams_update[attrs.key] = tomodify; + console.log(scope.plotterparams_update); + }); + } + }; +}); - var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + content_detail.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart"></div></div></div>'; - generate_element(scope, "plot", html_div_code); - var element = document.getElementById(chart_id); - var label_element = $(document.createElement('div')); - label_element.addClass('row'); +//Directive used to handle save plotterparameter click +app.directive("plotterparameteritems", function($compile) +{ + return function(scope, element, attrs) + { + scope.$on("addParametersElement", function(event) + { + console.log("broadcasted"); + //add the plot + var plotter_graph_element = document.getElementById('space-for-plotterparameter-plot'); + generate_graph(plotter_graph_element); - var accessnumber = "no_number"; - if(scope.report.number == scope.report_number) - { - accessnumber = "number"; - } + //add the parameters + var parameter_elements = document.getElementById('space-for-plotterparameter-items'); + append_plotterparameters(parameter_elements) - var prepend_buttons = '<div class="col-sm-12"><div class="action-buttons report-buttons pull-left">'; - var append_buttons = '</div></div>'; + //functions to operate on graph and parameters - var a_export = '<div class="btn-group"><button type="button" class="btn btn-primary btn-sm dropdown-toggle item_export ' + scope.report.status + ' ' + accessnumber + '" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-download fa-lg"></i> Export Figure <span class="caret"></span></button><ul class="dropdown-menu"><li id="PNG" buttonexportitem><a>PNG</a></li><li id="JPEG" buttonexportitem><a>JPEG</a></li><li id="PDF" buttonexportitem><a>PDF</a></li></ul></div>'; - if(scope.report.status == "editable" && scope.report.number != scope.report_number) { - var a_element = '<button class="btn btn-danger btn-sm item_delete ' + scope.report.status + ' ' + accessnumber + '" buttondeleteitem><i class="fa fa-times fa-lg"></i> Delete</button>'; - label_element.html(prepend_buttons + a_element + a_export + append_buttons); - } - else { - label_element.html(prepend_buttons + a_export + append_buttons); + function generate_graph(head_id) + { + var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" + $(head_id ).empty(); + angular.element(head_id).append($compile(html_div_code)(scope)); } -; - $(element).find('.panel-body').append(label_element); - angular.element(document.getElementById('space-for-report-items')).append($compile(element)(scope)); - //var html_dropdown = "<chartdropdown id='selector_" + chart_id +"'></chartdropdown>"; - //angular.element(document.getElementById(chart_id)).html($compile(html_dropdown)(scope)); - - _retrieve_chart(scope, content_detail, element); - - }); - - //add new report item - element.bind("click", function() - { - var left = $('.add_item').offset().left - $('.add_item').width() + 400; - var top = $('.add_item').offset().top; - smart_selector.display(scope.item_content.content, left, top); - var allblocks = []; - for(var i = 0; i < scope.report_experiments_blocks_merged_blocks.length; i++) + function append_plotterparameters(head_id) { - allblocks.push(scope.report_experiments_blocks_merged_blocks[i]); + var html_div_code = "<plotparams urlprefix=" + scope.url_prefix +"></plotparams>" + $(head_id ).empty(); + angular.element(head_id).append($compile(html_div_code)(scope)); } - scope.report.common_blocks = arraysInCommon(allblocks); - }); - //handles first selector selection (table/plot) - if(smart_selector != undefined) + }); + }; +}); + +//Directive used to handle dynamic testing on graph display +app.directive("testplotterparameters", function($compile) +{ + return function(scope, element, attrs) + { + element.bind("click", function() { - smart_selector.onEntrySelected = function(item_selected) - { + console.log("TODO:rewrite another plotter view"); + }); - var left = $('.add_item').offset().left - $('.add_item').width() + 400; - var top = $('.add_item').offset().top; + //scope.$on("addParametersElement", function(event) + //{ + // console.log("broadcasted"); + // //add the plot + // var plotter_graph_element = document.getElementById('space-for-plotterparameter-plot'); + // generate_graph(plotter_graph_element); + + // //add the parameters + // var parameter_elements = document.getElementById('space-for-plotterparameter-items'); + // append_plotterparameters(parameter_elements) + + // //functions to operate on graph and parameters + + // function generate_graph(head_id) + // { + // var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" + // $(head_id ).empty(); + // angular.element(head_id).append($compile(html_div_code)(scope)); + // } + + // function append_plotterparameters(head_id) + // { + // var html_div_code = "<plotparams urlprefix=" + scope.url_prefix +"></plotparams>" + // $(head_id ).empty(); + // angular.element(head_id).append($compile(html_div_code)(scope)); + // } + + //}); + }; +}); - var next_items_for_selector = prepareContent(scope, smart_selector.entries[smart_selector.selected_entry].identifier); - smart_selector_detail.display(next_items_for_selector, left, top); - }; - } +//end valid code for now - //handles next selector detail selection - if(smart_selector_detail != undefined) - { - smart_selector_detail.onEntrySelected = function(item_selected) - { - var left = $('.add_item').offset().left - $('.add_item').width() + 400; - var top = $('.add_item').offset().top; +app.directive('loadedcontent', function() +{ + //return { + // link: function (scope, elem, attrs, ctrl) { + // angular.element(document).ready(function() { + // console.info(scope.report.content); + // + // }); + // //$(window).load(function() { + // // + // // console.info(scope.report.content); + // // + // // }); + // } + //} +}); +//Directive for opening smart_selector list on "Add a report item" button click that displays options +app.directive("removeexperiment", function($compile) +{ + return function(scope, element, attrs) + { + //add new report item + element.bind("click", function() + { + removeExperiment(attrs.id); + }); - var result_next_items = nextDetailContent(scope, smart_selector.entries[smart_selector.selected_entry].identifier, smart_selector_detail.entries[smart_selector_detail.selected_entry]); - if(!result_next_items[0]) - { - multiple_selector.display(result_next_items[1], left, top); - } - }; + function removeExperiment(experiment_name) + { + beat.ui.report.remove_experiment('report_remove_experiment', experiment_name, scope); } + } +}); - //handles first creation of table based on options - if(multiple_selector != undefined) +//Directive for opening smart_selector list on "Add a report item" button click that displays options +app.directive("savereportitems", function($compile) +{ + return function(scope, element, attrs) + { + //add new report item + element.bind("click", function() { - multiple_selector.onEntrySelected = function(item_selected, data) - { - for(var i = 0; i < multiple_selector.entries.length; i++) - { - if(multiple_selector.entries[i].name == item_selected) - { - multiple_selector.entries[i].selected = true; - } - } - }; - - multiple_selector.onEntryDeselected = function(item_selected, data) + //var savecontent = []; + var savecontent = {}; + if(scope.plots_details != undefined) { - for(var i = 0; i < multiple_selector.entries.length; i++) + angular.forEach(scope.plots_details, function(value, key) { - if(multiple_selector.entries[i].name == item_selected) - { - multiple_selector.entries[i].selected = false; - } - } - }; - - multiple_selector.onClose = function() + //savecontent.push(key, value); + savecontent[key] = value; + }); + } + if(scope.tables_details != undefined) { - //check if at least one item is selected - var checkOneSelected = false; - angular.forEach(multiple_selector.entries, function(value, key) + angular.forEach(scope.tables_details, function(value, key) { - if(value.selected) - checkOneSelected = true + savecontent[key] = value; + //savecontent.push(key, value); }); - if(checkOneSelected) + if(scope.floating_point_precision.selected != undefined) { - var table_id = 'table' + '_' + scope.num_report_items; - - scope.tables_details[table_id] = multiple_selector.entries; - - var html_div_code = '<div class="panel panel-default" id="' + table_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + table_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-table"> Table</i></a></h4></div><div id="collapse-' + table_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div class="panel-body" table-dynamic monster=' + scope.num_report_items + " tableid=" + table_id + " reportstatus=" + scope.report.status + " urlprefix=" + scope.url_prefix + '></div></div></div>'; - - angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); - - scope.report.orderedcontent.push(table_id); - scope.num_report_items++; + savecontent["floating_point_precision"] = scope.floating_point_precision.selected; } } - } - - //handles single table updates via settings option - if(multiple_selector_updater != undefined) - { - multiple_selector_updater.onEntrySelected = function(item_selected, data) + if(scope.report_experiments_alias != undefined) { - for(var i = 0; i < multiple_selector_updater.entries.length; i++) + var alias_experiments = {}; + angular.forEach(scope.report_experiments_alias, function(value, key) { - if(multiple_selector_updater.entries[i].name == item_selected) - { - multiple_selector_updater.entries[i].selected = true; - } - } - }; + alias_experiments[key] = value; + }); + savecontent["alias_experiments"] = alias_experiments; + } - multiple_selector_updater.onEntryDeselected = function(item_selected, data) + if(!(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_reverse)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables_sortkey))) { - for(var i = 0; i < multiple_selector_updater.entries.length; i++) - { - if(multiple_selector_updater.entries[i].name == item_selected) - { - multiple_selector_updater.entries[i].selected = false; - } - } - }; + 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; + mydict["content"] = savecontent; - multiple_selector_updater.onClose = function() + for(var i = 0; i < scope.report.experiments.length; i++) { + scope.report_experiments_alias_from_content[scope.report.experiments[i]] = scope.report_experiments_alias[scope.report.experiments[i]]; + } - //check if at least one item is selected - var checkOneSelected = false; - angular.forEach(multiple_selector_updater.entries, function(value, key) + updateReport(mydict); + }); + + + function updateReport(data) + { + scope.reportFactory.updateReport(scope.user, scope.report_id, data, scope.url_prefix) + .success(function (reportData) { - if(value.selected) - checkOneSelected = true - }); + //alert("The report "+ scope.report_id +" has been saved."); - if(checkOneSelected) + beat.ui.report.report_saved('report_saved', scope); + }) + .error(function (error) { - var element = document.getElementById(multiple_selector_updater.current_table); + scope.status = 'Unable to update report data: ' + error.message; - $(element).attr('id', null); - $compile(element)(scope); - $(element).attr('id', multiple_selector_updater.current_table); - } - } + }); - }; + } + } +}); - //Prepare the content for selector initialization - function prepareContent(scope, content_identifier) +//Directive for opening smart_selector list on "Add a report item" button click that displays options +app.directive("lockreport", function($compile) +{ + return function(scope, element, attrs) { - var next_content_items = []; - - switch(content_identifier) + //add new report item + element.bind("click", function() { - case 'table': - next_content_items = scope.table_item_content.content; - break; - case 'plot': - angular.forEach(scope.report_experiments, function(value, key) - { - angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) - { - if(value_analyzer.algorithm == scope.report.analyzer) - { - scope.report_experiments[key].analyzer_block = key_analyzer; - } - }); + lockReport(); + }); - var plottable_result = []; - angular.forEach(value.results[scope.report_experiments[key].analyzer_block], function(value_result_item, key_result_item) - { - if(value_result_item.type.startsWith("plot/")) - { - plottable_result.push(key_result_item); - } - }); + function lockReport() + { + beat.ui.report.lock_report('report_lock', scope); + } + } +}); - scope.report_experiments[key].plottable_blocks = plottable_result; +//Directive for opening smart_selector list on "Add a report item" button click that displays options +app.directive("publishreport", function($compile) +{ + return function(scope, element, attrs) + { + //add new report item + element.bind("click", function() + { + publishReport(); + }); - }); - //Results block are the same for all experiments from same analyzer. - //So just grab information from one of them for smart_selector items - var single_experiment = scope.report.experiments[0]; + function publishReport() + { + scope.reportFactory.publishReportAlgorithms(scope.user, scope.report_id, scope.url_prefix) + .success(function (reportData) + { + beat.ui.report.publish_report('report_publish', scope, reportData); + }) + .error(function (error) + { + scope.status = 'Unable to publish report data: ' + error; + $(".explanation_text").hide(); + $("#report_publish .warnings").hide(); + $("#report_publish .errors").show(); + if(error.detail != undefined) + scope.status = 'Unable to publish report data: ' + error.detail; + $("#report_publish .errors .errorslist").append(scope.status); + $("#button-report_publish-cancel").hide(); + }); - //create smart_selector items - angular.forEach(scope.report_experiments[single_experiment].plottable_blocks, function(value_plottable, key_plottable) - { - var plot_type = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_plottable].type; - var item_dict = {}; - item_dict["identifier"] = value_plottable; - item_dict["name"] = value_plottable; - item_dict["description"] = plot_type; - next_content_items.push(item_dict); - }); - break; } + } +}); + +//Directive for opening smart_selector list on "Add a report item" button click that displays options +app.directive("addreportitem", function($compile) +{ + return function(scope, element, attrs) + { + scope.$on("addSavedElement", function(event, id_content, type) + { + var num_tables_in_content = 0; + var num_figures_in_content = 0; + for(var i = 0; i < Object.keys(scope.report.content).length; i++) + { + if(Object.keys(scope.report.content)[i].indexOf("table_") == 0) + { + num_tables_in_content++; + } + else if(Object.keys(scope.report.content)[i].indexOf("chart_") == 0) + { + num_figures_in_content++; + } + } - return next_content_items; - } + if(type == "table") + { + var table_id = id_content; + var table_details = undefined; - //Get the detailed content for next selector - function nextDetailContent(scope, content_identifier, sub_content) - { - var is_end = false; - var next_items = []; - var return_contents = []; - switch(content_identifier) - { - case 'table': - is_end = false; - angular.forEach(scope.report_experiments, function(value, key) + //take the one with more elements + if(Object.keys(scope.tables_details).length > num_tables_in_content) { - angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) - { - if(value_analyzer.algorithm == scope.report.analyzer) - { - scope.report_experiments[key].analyzer_block = key_analyzer; - } - }); + table_details = scope.tables_details[id_content]; + } + else + { + table_details = scope.report.content[id_content]; + } - var table_result = []; - angular.forEach(value.results[scope.report_experiments[key].analyzer_block], function(value_result_item, key_result_item) + var name_to_remove = "experiment"; + for(var i = 0; i < table_details.length; i++) + { + if(table_details[i].name == "experiment") { - if(!(value_result_item.type.startsWith("plot/"))) - { - table_result.push(key_result_item); - } - - }); - - scope.report_experiments[key].table_result_blocks = table_result; + table_details.splice(i,1); + break; + } + } - }); + scope.tables_details[table_id] = table_details; - //Results block are the same for all experiments from same analyzer. - //So just grab information from one of them for smart_selector items - var single_experiment = scope.report.experiments[0]; + var accessnumber = "no_number"; + if(scope.report.number == scope.report_number) + { + accessnumber = "number"; + } + var html_div_code = '<div class="panel panel-default" id="' + table_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + table_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-table"> Table</i></a></h4></div><div id="collapse-' + table_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div class="panel-body" table-dynamic monster=' + scope.num_report_items + " tableid=" + table_id + " reportstatus=" + scope.report.status + " accessnumber=" + accessnumber + " urlprefix=" + scope.url_prefix + '></div></div></div>'; - //create smart_selector items - angular.forEach(scope.report_experiments[single_experiment].table_result_blocks, function(value_table_result, key_table_result) + angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); + if(parseInt(table_id.split("_").pop(-1)) >= scope.max_num) { + scope.max_num = parseInt(table_id.split("_").pop(-1)); + scope.num_report_items = scope.max_num; + } - var table_item_data = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_table_result]; - var item_dict = {}; - item_dict["identifier"] = value_table_result; - item_dict["name"] = value_table_result; - item_dict["description"] = table_item_data.type; - if(table_item_data.primary) - item_dict["selected"] = true; - else - item_dict["selected"] = false; - item_dict["data"] = table_item_data; + scope.num_report_items++; + } + else if(type == "chart") + { - next_items.push(item_dict); - }); + var content_detail = {}; + var chart_id = id_content; - //adding execution time entry information for common blocks - angular.forEach(scope.report.common_blocks, function(value_table_result, key_table_result) + var plot_details = undefined; + + //take the one with more elements + if(Object.keys(scope.plots_details).length > num_figures_in_content) { - var item_dict = {}; - item_dict["identifier"] = "execution_time." + value_table_result; - item_dict["name"] = "execution_time." + value_table_result; - item_dict["selected"] = false; - next_items.push(item_dict); + plot_details = scope.plots_details[chart_id]; + } + else + { + plot_details = scope.report.content[chart_id]; + } - }); - //adding total execution time entry information for experiment - var item_dict = {}; - item_dict["identifier"] = "experiment.execution_time"; - item_dict["name"] = "experiment.execution_time"; - item_dict["selected"] = false; - next_items.push(item_dict); - //adding globals algorithms parameters - angular.forEach(scope.report_algorithm_parameters, function(value_algorithm_parameters, key_algorithm_parameters) + content_detail["name"] = plot_details.data.output[0]; + //content_detail["description"] = scope.report.content[chart_id].data.plotter; + if(plot_details.data.plotter != undefined) { - for(var i = 0; i < Object.keys(value_algorithm_parameters).length; i++) - { - var item_dict = {}; - item_dict["identifier"] = "algorithm_parameter." + key_algorithm_parameters + "__" +Object.keys(value_algorithm_parameters)[i]; - item_dict["name"] = "algorithm_parameter." + key_algorithm_parameters + "__" +Object.keys(value_algorithm_parameters)[i]; - item_dict["selected"] = false; - next_items.push(item_dict); - } - - }); + content_detail["selected_plotter"] = plot_details.data.plotter; + } + if(plot_details.selected_template != undefined) + { + content_detail["selected_template"] = plot_details.selected_template; + } + if(plot_details.data.merged != undefined) + { + content_detail["merged"] = plot_details.data.merged; + } + if(plot_details.merged != undefined) + { + content_detail["merged"] = plot_details.merged; + } - break; - case 'plot': - is_end = true; - var chart_id = 'chart_' + sub_content.identifier + '_graph' + '_' + scope.num_report_items; - var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + sub_content.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart {$ report.status $}"></div></div></div>'; - generate_element(scope, content_identifier, html_div_code); + var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + content_detail.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart {$ report.status $}"></div></div></div>'; + generate_element(scope, "plot", html_div_code); var element = document.getElementById(chart_id); var label_element = $(document.createElement('div')); label_element.addClass('row'); @@ -710,1064 +811,1008 @@ app.directive("addreportitem", function($compile) else { label_element.html(prepend_buttons + a_export + append_buttons); } +; $(element).find('.panel-body').append(label_element); - angular.element(document.getElementById('space-for-report-items')).append($compile(element)(scope)); + //var html_dropdown = "<chartdropdown id='selector_" + chart_id +"'></chartdropdown>"; + //angular.element(document.getElementById(chart_id)).append($compile(html_dropdown)(scope)); - _retrieve_chart(scope, sub_content, element); - scope.report.orderedcontent.push(chart_id); - break; - } + _retrieve_chart(scope, content_detail, element); - return_contents = [is_end, next_items]; + if(parseInt(chart_id.split("_").pop(-1)) >= scope.max_num) + { + scope.max_num = parseInt(chart_id.split("_").pop(-1)); + scope.num_report_items = scope.max_num; + } - return return_contents; + scope.num_report_items++; - } + } - //Generate and compile DOM element - function generate_element(scope, content_identifier, html_div_code) - { - switch(content_identifier) - { - case 'table': - angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); - scope.num_report_items++; - break; - case 'plot': - angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); - scope.num_report_items++; - break; } + ); - } - - //Retrieve chart from api and display on proper item - function _get_chart(scope, sub_content, content_type, chart_id) - { - var required_plotter = []; - var set_plotter = '' - if(sub_content.selected_plotter != undefined) + scope.$on("redrawGraphElement", function(event, id_content, type) { - //required_plotter.push(sub_content.selected_plotter); - set_plotter = sub_content.selected_plotter; - var requested_dataformat = ''; - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) + var content_detail = {}; + var chart_id = id_content; + content_detail["name"] = scope.report.content[chart_id].data.output[0]; + //content_detail["description"] = scope.report.content[chart_id].data.plotter; + if(scope.report.content[chart_id].data.plotter != undefined) { - if(scope.report.plotters[i].name == sub_content.selected_plotter) - { - requested_dataformat = scope.report.plotters[i].dataformat; - break; - } + content_detail["selected_plotter"] = scope.report.content[chart_id].data.plotter; } - - //Get default plotter for required dataformat - for (var i = 0; i < scope.report.defaultplotters.length; i++) + if(scope.report.content[chart_id].data.parameter != undefined) { - if(scope.report.defaultplotters[i].dataformat == requested_dataformat) - { - sub_content.defaultplotter = scope.report.defaultplotters[i]; - break; - } + content_detail["selected_template"] = scope.report.content[chart_id].data.parameter; + } + if(scope.report.content[chart_id].data.merged != undefined) + { + content_detail["merged"] = scope.report.content[chart_id].data.merged; } - required_plotter.push(sub_content.defaultplotter.plotter); + var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + content_detail.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart"></div></div></div>'; + generate_element(scope, "plot", html_div_code); + var element = document.getElementById(chart_id); + var label_element = $(document.createElement('div')); + label_element.addClass('row'); - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) + var accessnumber = "no_number"; + if(scope.report.number == scope.report_number) { - if(scope.report.plotters[i].dataformat == requested_dataformat && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) - { - required_plotter.push(scope.report.plotters[i].name); - } + accessnumber = "number"; } - } - else - { - //Get default plotter for required dataformat - for (var i = 0; i < scope.report.defaultplotters.length; i++) - { - if(scope.report.defaultplotters[i].dataformat == sub_content.description) - { - sub_content.defaultplotter = scope.report.defaultplotters[i]; - break; - } + + var prepend_buttons = '<div class="col-sm-12"><div class="action-buttons report-buttons pull-left">'; + var append_buttons = '</div></div>'; + + var a_export = '<div class="btn-group"><button type="button" class="btn btn-primary btn-sm dropdown-toggle item_export ' + scope.report.status + ' ' + accessnumber + '" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-download fa-lg"></i> Export Figure <span class="caret"></span></button><ul class="dropdown-menu"><li id="PNG" buttonexportitem><a>PNG</a></li><li id="JPEG" buttonexportitem><a>JPEG</a></li><li id="PDF" buttonexportitem><a>PDF</a></li></ul></div>'; + if(scope.report.status == "editable" && scope.report.number != scope.report_number) { + var a_element = '<button class="btn btn-danger btn-sm item_delete ' + scope.report.status + ' ' + accessnumber + '" buttondeleteitem><i class="fa fa-times fa-lg"></i> Delete</button>'; + label_element.html(prepend_buttons + a_element + a_export + append_buttons); + } + else { + label_element.html(prepend_buttons + a_export + append_buttons); } +; + $(element).find('.panel-body').append(label_element); + angular.element(document.getElementById('space-for-report-items')).append($compile(element)(scope)); + //var html_dropdown = "<chartdropdown id='selector_" + chart_id +"'></chartdropdown>"; + //angular.element(document.getElementById(chart_id)).html($compile(html_dropdown)(scope)); - required_plotter.push(sub_content.defaultplotter.plotter); - set_plotter = sub_content.defaultplotter.plotter; + _retrieve_chart(scope, content_detail, element); - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) - { - if(scope.report.plotters[i].dataformat == sub_content.description && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) - { - required_plotter.push(scope.report.plotters[i].name); - } - } - } + }); - var plotterparameter = []; - //Get other plotterparameter - for (var i = 0; i < scope.report.plotterparameter.length; i++) + //add new report item + element.bind("click", function() { - plotterparameter.push(scope.report.plotterparameter[i].name); - } + var left = $('.add_item').offset().left - $('.add_item').width() + 400; + var top = $('.add_item').offset().top; + smart_selector.display(scope.item_content.content, left, top); - var chart_name = sub_content.name; + var allblocks = []; + for(var i = 0; i < scope.report_experiments_blocks_merged_blocks.length; i++) + { + allblocks.push(scope.report_experiments_blocks_merged_blocks[i]); + } + scope.report.common_blocks = arraysInCommon(allblocks); + }); - var legend_experiments = ''; - var alias_experiments = []; - for(var i = 0; i < scope.report.experiments.length; i++) + //handles first selector selection (table/plot) + if(smart_selector != undefined) { - if(i == 0) - legend_experiments = scope.report_experiments_alias[scope.report.experiments[i]]; - else - legend_experiments = legend_experiments+ "&" +scope.report_experiments_alias[scope.report.experiments[i]]; - - alias_experiments.push(scope.report_experiments_alias[scope.report.experiments[i]]); - } - - var request_data = { - experiment: alias_experiments, - analyzer: [scope.report.analyzer], - output: [chart_name], - plotter: set_plotter, - legend: legend_experiments, - report_number: scope.report.number, - //height: 300, - //width: 400, - }; - - base_url = scope.report.url_prefix; + smart_selector.onEntrySelected = function(item_selected) + { - var plot_detail = {}; - plot_detail["required_plotter"] = required_plotter; - plot_detail["data"] = { - analyzer: [scope.report.analyzer], - output: [chart_name], - plotter: set_plotter, - }; + var left = $('.add_item').offset().left - $('.add_item').width() + 400; + var top = $('.add_item').offset().top; - if(sub_content.selected_template != undefined)// && sub_content.selected_template != "Default") - { - plot_detail["selected_template"] = sub_content.selected_template; - request_data.parameter = plot_detail["selected_template"]; - } - else - { - plot_detail["selected_template"] = sub_content.defaultplotter.parameter; - request_data.parameter = plot_detail["selected_template"]; + var next_items_for_selector = prepareContent(scope, smart_selector.entries[smart_selector.selected_entry].identifier); + smart_selector_detail.display(next_items_for_selector, left, top); + }; } - if(sub_content.merged != undefined)// && sub_content.selected_template != "Default") - { - plot_detail["merged"] = sub_content.merged; - request_data.merged = plot_detail["merged"]; - } - else + //handles next selector detail selection + if(smart_selector_detail != undefined) { - plot_detail["merged"] = true; - request_data.merged = plot_detail["merged"]; - } + smart_selector_detail.onEntrySelected = function(item_selected) + { + var left = $('.add_item').offset().left - $('.add_item').width() + 400; + var top = $('.add_item').offset().top; - beat.experiments.utils.getPlotData(base_url, - request_data, required_plotter, plotterparameter, content_type, - function(r_image_data, selected_content_type) { - download(r_image_data, chart_id + "." + content_type.toLowerCase(), selected_content_type); - } - ); - } + var result_next_items = nextDetailContent(scope, smart_selector.entries[smart_selector.selected_entry].identifier, smart_selector_detail.entries[smart_selector_detail.selected_entry]); - //Retrieve chart from api and display on proper item - function _retrieve_chart(scope, sub_content, container) - { - var required_plotter = []; - var set_plotter = '' - if(sub_content.selected_plotter != undefined) + if(!result_next_items[0]) + { + multiple_selector.display(result_next_items[1], left, top); + } + }; + } + + //handles first creation of table based on options + if(multiple_selector != undefined) { - //required_plotter.push(sub_content.selected_plotter); - set_plotter = sub_content.selected_plotter; - var requested_dataformat = ''; - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) + multiple_selector.onEntrySelected = function(item_selected, data) { - if(scope.report.plotters[i].name == sub_content.selected_plotter) + for(var i = 0; i < multiple_selector.entries.length; i++) { - requested_dataformat = scope.report.plotters[i].dataformat; - break; + if(multiple_selector.entries[i].name == item_selected) + { + multiple_selector.entries[i].selected = true; + } } - } + }; - //Get default plotter for required dataformat - for (var i = 0; i < scope.report.defaultplotters.length; i++) + multiple_selector.onEntryDeselected = function(item_selected, data) { - if(scope.report.defaultplotters[i].dataformat == requested_dataformat) + for(var i = 0; i < multiple_selector.entries.length; i++) { - sub_content.defaultplotter = scope.report.defaultplotters[i]; - break; + if(multiple_selector.entries[i].name == item_selected) + { + multiple_selector.entries[i].selected = false; + } } - } - - required_plotter.push(sub_content.defaultplotter.plotter); + }; - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) + multiple_selector.onClose = function() { - if(scope.report.plotters[i].dataformat == requested_dataformat && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) + //check if at least one item is selected + var checkOneSelected = false; + angular.forEach(multiple_selector.entries, function(value, key) { - required_plotter.push(scope.report.plotters[i].name); + if(value.selected) + checkOneSelected = true + }); + + if(checkOneSelected) + { + var table_id = 'table' + '_' + scope.num_report_items; + + scope.tables_details[table_id] = multiple_selector.entries; + + var html_div_code = '<div class="panel panel-default" id="' + table_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + table_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-table"> Table</i></a></h4></div><div id="collapse-' + table_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div class="panel-body" table-dynamic monster=' + scope.num_report_items + " tableid=" + table_id + " reportstatus=" + scope.report.status + " urlprefix=" + scope.url_prefix + '></div></div></div>'; + + angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); + + scope.report.orderedcontent.push(table_id); + scope.num_report_items++; } } } - else + + //handles single table updates via settings option + if(multiple_selector_updater != undefined) { - //Get default plotter for required dataformat - for (var i = 0; i < scope.report.defaultplotters.length; i++) + multiple_selector_updater.onEntrySelected = function(item_selected, data) { - if(scope.report.defaultplotters[i].dataformat == sub_content.description) + for(var i = 0; i < multiple_selector_updater.entries.length; i++) { - sub_content.defaultplotter = scope.report.defaultplotters[i]; - break; + if(multiple_selector_updater.entries[i].name == item_selected) + { + multiple_selector_updater.entries[i].selected = true; + } } - } + }; - required_plotter.push(sub_content.defaultplotter.plotter); - set_plotter = sub_content.defaultplotter.plotter; + multiple_selector_updater.onEntryDeselected = function(item_selected, data) + { + for(var i = 0; i < multiple_selector_updater.entries.length; i++) + { + if(multiple_selector_updater.entries[i].name == item_selected) + { + multiple_selector_updater.entries[i].selected = false; + } + } + }; - //Get other plotters for required dataformat - for (var i = 0; i < scope.report.plotters.length; i++) + multiple_selector_updater.onClose = function() { - if(scope.report.plotters[i].dataformat == sub_content.description && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) + + //check if at least one item is selected + var checkOneSelected = false; + angular.forEach(multiple_selector_updater.entries, function(value, key) { - required_plotter.push(scope.report.plotters[i].name); + if(value.selected) + checkOneSelected = true + }); + + if(checkOneSelected) + { + var element = document.getElementById(multiple_selector_updater.current_table); + + $(element).attr('id', null); + $compile(element)(scope); + $(element).attr('id', multiple_selector_updater.current_table); } } - } - - var plotterparameter = []; - //Get other plotterparameter - for (var i = 0; i < scope.report.plotterparameter.length; i++) - { - plotterparameter.push(scope.report.plotterparameter[i].name); - } - var chart_name = sub_content.name; + }; - var legend_experiments = ''; - var alias_experiments = []; + //Prepare the content for selector initialization + function prepareContent(scope, content_identifier) + { + var next_content_items = []; - for(var i = 0; i < scope.report.experiments.length; i++) + switch(content_identifier) { - if(i == 0) - legend_experiments = scope.report_experiments_alias[scope.report.experiments[i]]; - else - legend_experiments = legend_experiments+ "&" +scope.report_experiments_alias[scope.report.experiments[i]]; + case 'table': + next_content_items = scope.table_item_content.content; + break; + case 'plot': + angular.forEach(scope.report_experiments, function(value, key) + { + angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) + { + if(value_analyzer.algorithm == scope.report.analyzer) + { + scope.report_experiments[key].analyzer_block = key_analyzer; + } + }); - if(Object.keys(scope.$parent.report_experiments_alias_from_content).length === 0) - alias_experiments.push(scope.report_experiments_alias[scope.report.experiments[i]]); - else - alias_experiments.push(scope.report_experiments_alias_from_content[scope.report.experiments[i]]); - } + var plottable_result = []; + angular.forEach(value.results[scope.report_experiments[key].analyzer_block], function(value_result_item, key_result_item) + { + if(value_result_item.type.startsWith("plot/")) + { + plottable_result.push(key_result_item); + } - var request_data = { - experiment: alias_experiments, - analyzer: [scope.report.analyzer], - output: [chart_name], - plotter: set_plotter, - legend: legend_experiments, - report_number: scope.report.number, - //height: 300, - //width: 400, - }; + }); - base_url = scope.report.url_prefix; - //scope.plots_details[container.id]; + scope.report_experiments[key].plottable_blocks = plottable_result; - var plot_detail = {}; - plot_detail["required_plotter"] = required_plotter; - plot_detail["data"] = { - analyzer: [scope.report.analyzer], - output: [chart_name], - plotter: set_plotter, - }; + }); + //Results block are the same for all experiments from same analyzer. + //So just grab information from one of them for smart_selector items + var single_experiment = scope.report.experiments[0]; - if(sub_content.selected_template != undefined)// && sub_content.selected_template != "Default") - { - plot_detail["selected_template"] = sub_content.selected_template; - request_data.parameter = plot_detail["selected_template"]; - } - else - { - plot_detail["selected_template"] = sub_content.defaultplotter.parameter; - request_data.parameter = plot_detail["selected_template"]; - } + //create smart_selector items + angular.forEach(scope.report_experiments[single_experiment].plottable_blocks, function(value_plottable, key_plottable) + { + var plot_type = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_plottable].type; + var item_dict = {}; + item_dict["identifier"] = value_plottable; + item_dict["name"] = value_plottable; + item_dict["description"] = plot_type; - if(sub_content.merged != undefined)// && sub_content.selected_template != "Default") - { - plot_detail["merged"] = sub_content.merged; - request_data.merged = plot_detail["merged"]; - } - else - { - plot_detail["merged"] = true; - request_data.merged = plot_detail["merged"]; + next_content_items.push(item_dict); + }); + break; } - scope.plots_details[container.id]= plot_detail; + return next_content_items; + } - if(scope.report.status == "editable" && scope.report.number != scope.report_number) + //Get the detailed content for next selector + function nextDetailContent(scope, content_identifier, sub_content) + { + var is_end = false; + var next_items = []; + var return_contents = []; + switch(content_identifier) { - beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0], - request_data, required_plotter, plotterparameter, false, + case 'table': + is_end = false; + angular.forEach(scope.report_experiments, function(value, key) + { + angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) + { + if(value_analyzer.algorithm == scope.report.analyzer) + { + scope.report_experiments[key].analyzer_block = key_analyzer; + } + }); - function(r_plotter, r_plotterparameter, r_merged) { - scope.plots_details[container.id]["data"]["plotter"] = r_plotter; - scope.plots_details[container.id]["selected_template"] = r_plotterparameter; - scope.plots_details[container.id]["merged"] = r_merged; - } - ); - } - else - { - beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0], - request_data, [], [], false, + var table_result = []; + angular.forEach(value.results[scope.report_experiments[key].analyzer_block], function(value_result_item, key_result_item) + { + if(!(value_result_item.type.startsWith("plot/"))) + { + table_result.push(key_result_item); + } - function(r_plotter, r_plotterparameter, r_merged) { - } - ); - } - } + }); + + scope.report_experiments[key].table_result_blocks = table_result; - function arraysInCommon(arrays) - { - var i, common, - L= arrays.length, min= Infinity; - while(L){ - if(arrays[--L].length<min){ - min= arrays[L].length; - i= L; - } - } - common= arrays.splice(i, 1)[0]; - return common.filter(function(itm, indx){ - if(common.indexOf(itm)== indx){ - return arrays.every(function(arr){ - return arr.indexOf(itm)!= -1; }); - } - }); - } - } -}); + //Results block are the same for all experiments from same analyzer. + //So just grab information from one of them for smart_selector items + var single_experiment = scope.report.experiments[0]; + //create smart_selector items + angular.forEach(scope.report_experiments[single_experiment].table_result_blocks, function(value_table_result, key_table_result) + { -//Dynamic tables items -app.directive('item', function ($compile) { - function createTDElement(column) { - var table = angular.element('<table><tr><td class="tableitemspace" thecolumn="' + column + '"></td></tr></table>'); - return table.find('td'); - } + var table_item_data = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_table_result]; + var item_dict = {}; + item_dict["identifier"] = value_table_result; + item_dict["name"] = value_table_result; + item_dict["description"] = table_item_data.type; + if(table_item_data.primary) + item_dict["selected"] = true; + else + item_dict["selected"] = false; + item_dict["data"] = table_item_data; - function render(element, scope) { - var column, html, i; - var columns = scope.$parent.tables_details[scope.$parent.dattrs.tableid]; + next_items.push(item_dict); + }); - for (i = 0; i < columns.length ; i++) { - if(i == 0 && columns.length > 0) - { - html = $compile(createTDElement("experiment"))(scope); + //adding execution time entry information for common blocks + angular.forEach(scope.report.common_blocks, function(value_table_result, key_table_result) + { + var item_dict = {}; + item_dict["identifier"] = "execution_time." + value_table_result; + item_dict["name"] = "execution_time." + value_table_result; + item_dict["selected"] = false; + next_items.push(item_dict); - } - column = columns[i]; - if (column.selected) { + }); - html = $compile(createTDElement(column.name))(scope); - element.append(html); - } - } + //adding total execution time entry information for experiment + var item_dict = {}; + item_dict["identifier"] = "experiment.execution_time"; + item_dict["name"] = "experiment.execution_time"; + item_dict["selected"] = false; + next_items.push(item_dict); + //adding globals algorithms parameters + angular.forEach(scope.report_algorithm_parameters, function(value_algorithm_parameters, key_algorithm_parameters) + { + for(var i = 0; i < Object.keys(value_algorithm_parameters).length; i++) + { + var item_dict = {}; + item_dict["identifier"] = "algorithm_parameter." + key_algorithm_parameters + "__" +Object.keys(value_algorithm_parameters)[i]; + item_dict["name"] = "algorithm_parameter." + key_algorithm_parameters + "__" +Object.keys(value_algorithm_parameters)[i]; + item_dict["selected"] = false; + next_items.push(item_dict); + } - } + }); - return { - // restrict: 'A', - scope: { - exp_name: "=", - item: "=", - columns: "=" - }, - compile: function () { - return function (scope, element) { - render(element, scope); - } + break; + case 'plot': + is_end = true; + var chart_id = 'chart_' + sub_content.identifier + '_graph' + '_' + scope.num_report_items; + var html_div_code = '<div class="panel panel-default" id="' + chart_id + '"><div class="panel-heading" role="tab"><h4 class="panel-title"><a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-' + chart_id + '" aria-expanded="true" aria-controls="collapse-info"><i class="fa fa-area-chart"> ' + sub_content.name + '</i></a></h4></div><div id="collapse-' + chart_id + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"><div id="'+chart_id+'" class="panel-body chart {$ report.status $}"></div></div></div>'; + generate_element(scope, content_identifier, html_div_code); + var element = document.getElementById(chart_id); + var label_element = $(document.createElement('div')); + label_element.addClass('row'); - } - }; + var accessnumber = "no_number"; + if(scope.report.number == scope.report_number) + { + accessnumber = "number"; + } -}); + var prepend_buttons = '<div class="col-sm-12"><div class="action-buttons report-buttons pull-left">'; + var append_buttons = '</div></div>'; + + var a_export = '<div class="btn-group"><button type="button" class="btn btn-primary btn-sm dropdown-toggle item_export ' + scope.report.status + ' ' + accessnumber + '" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-download fa-lg"></i> Export Figure <span class="caret"></span></button><ul class="dropdown-menu"><li id="PNG" buttonexportitem><a>PNG</a></li><li id="JPEG" buttonexportitem><a>JPEG</a></li><li id="PDF" buttonexportitem><a>PDF</a></li></ul></div>'; + if(scope.report.status == "editable" && scope.report.number != scope.report_number) { + var a_element = '<button class="btn btn-danger btn-sm item_delete ' + scope.report.status + ' ' + accessnumber + '" buttondeleteitem><i class="fa fa-times fa-lg"></i> Delete</button>'; + label_element.html(prepend_buttons + a_element + a_export + append_buttons); + } + else { + label_element.html(prepend_buttons + a_export + append_buttons); + } + $(element).find('.panel-body').append(label_element); + + angular.element(document.getElementById('space-for-report-items')).append($compile(element)(scope)); + + _retrieve_chart(scope, sub_content, element); + scope.report.orderedcontent.push(chart_id); + break; + } -//Directive used to set proper item value in selected column -app.directive("thecolumn",['$compile', function ($compile) { + return_contents = [is_end, next_items]; - return { - scope: { - thecolumn: "@" - }, - restrict: 'A', - template: '{{itemValue}}', - controller: ['$scope', function ($scope) { + return return_contents; - 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 - } + //Generate and compile DOM element + function generate_element(scope, content_identifier, html_div_code) + { + switch(content_identifier) + { + case 'table': + angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); + scope.num_report_items++; + break; + case 'plot': + angular.element(document.getElementById('space-for-report-items')).append($compile(html_div_code)(scope)); + scope.num_report_items++; + break; + } - var analyzer_block = report_experiments[experiment_name].analyzer_block; - var report_algorithm_parameters_experiment = $scope.$parent.$parent.$parent.$parent.report_algorithm_parameters_experiment; + } - if($scope.thecolumn != "experiment") - { - if(analyzer_block == undefined) + //Retrieve chart from api and display on proper item + function _get_chart(scope, sub_content, content_type, chart_id) + { + var required_plotter = []; + var set_plotter = '' + if(sub_content.selected_plotter != undefined) + { + //required_plotter.push(sub_content.selected_plotter); + set_plotter = sub_content.selected_plotter; + var requested_dataformat = ''; + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) { - angular.forEach(report_experiments, function(value, key) + if(scope.report.plotters[i].name == sub_content.selected_plotter) { - angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer) - { - if(value_analyzer.algorithm == report.analyzer && (key_analyzer in report_experiments[experiment_name].declaration.analyzers)) - { - report_experiments[experiment_name].analyzer_block = key_analyzer; - analyzer_block = report_experiments[experiment_name].analyzer_block; - } - }); - }); + requested_dataformat = scope.report.plotters[i].dataformat; + break; + } } - if($scope.thecolumn.indexOf("execution_time.") == 0) + //Get default plotter for required dataformat + for (var i = 0; i < scope.report.defaultplotters.length; i++) { - //execution time information - var block_name = $scope.thecolumn.split("execution_time.")[1].split("[s]")[0]; - if(Object.keys(report_experiments[experiment_name].execution_info).length === 0) - { - $scope.itemValue = "-"; - } - else + if(scope.report.defaultplotters[i].dataformat == requested_dataformat) { - if(report_experiments[experiment_name].execution_info[block_name] == undefined) - { - $scope.itemValue = "-"; - } - else - { - $scope.itemValue = (report_experiments[experiment_name].execution_info[block_name].linear_execution_time).toFixed(floating_point_precision.selected);; - } + sub_content.defaultplotter = scope.report.defaultplotters[i]; + break; } } - else if($scope.thecolumn.indexOf("experiment.") == 0) + + required_plotter.push(sub_content.defaultplotter.plotter); + + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) { - //total execution time information - var block_name = $scope.thecolumn.split("execution_time.")[1]; - var total_time = 0; - if(Object.keys(report_experiments[experiment_name].execution_info).length === 0) - { - total_time = "-"; - } - else + if(scope.report.plotters[i].dataformat == requested_dataformat && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) { - angular.forEach(report_experiments[experiment_name].execution_info, function(value, key) - { - total_time += value.linear_execution_time; - }); + required_plotter.push(scope.report.plotters[i].name); } - - $scope.itemValue = total_time.toFixed(floating_point_precision.selected); } - else if($scope.thecolumn.indexOf("algorithm_parameter.") == 0) + } + else + { + //Get default plotter for required dataformat + for (var i = 0; i < scope.report.defaultplotters.length; i++) { - //total execution time information - var block_name = $scope.thecolumn.split("algorithm_parameter.")[1]; - var algorithm_name = block_name.split("__")[0]; - var parameter_name = block_name.split("__")[1]; - if(report_algorithm_parameters_experiment[experiment_name][algorithm_name] != undefined) - { - var value = ""; - if(report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name] != undefined) - { - for(var i = 0; i < report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name].length; i++) - { - if(i > 0 && i < report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name].length -1 ) - { - value += ","; - } - value = report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name][i]; - } - } - else if(report["all_experiments"][experiment_name]["declaration"]["globals"][algorithm_name][parameter_name] != undefined) - { - //get globals value - value = report["all_experiments"][experiment_name]["declaration"]["globals"][algorithm_name][parameter_name]; - } - else - { - //nothing is defined - value = "-"; - } - - $scope.itemValue = value; - } - else + if(scope.report.defaultplotters[i].dataformat == sub_content.description) { - $scope.itemValue = "-"; + sub_content.defaultplotter = scope.report.defaultplotters[i]; + break; } } - else + + required_plotter.push(sub_content.defaultplotter.plotter); + set_plotter = sub_content.defaultplotter.plotter; + + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) { - //results information - $scope.itemValue = (report_experiments[experiment_name].results[analyzer_block][$scope.thecolumn].value).toFixed(floating_point_precision.selected); + if(scope.report.plotters[i].dataformat == sub_content.description && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) + { + required_plotter.push(scope.report.plotters[i].name); + } } - } - else - { - var experiment_alias = report_experiments_alias[experiment_name]; - $scope.itemValue = experiment_alias; - } - }]//, - //link: function(scope, element, attrs) - //{ - // console.log(scope); - // var report_experiments_alias = scope.$parent.$parent.$parent.$parent.report_experiments_alias; - // var experiment_name = scope.$parent.item; - // var experiment_alias = report_experiments_alias[experiment_name]; - // scope.$watch(scope.$parent.$parent.$parent.$parent.report_experiments_alias,function(newValue, oldValue) - // { - // console.log("changed"); - // console.log(report_experiments_alias); - // console.log(oldValue); - // console.log(newValue); - // }); - // - //} - } -}]); - -//Directive used to generate the dynamic table loading partials -app.directive("tableDynamic", function(){ + } - return { - restrict: 'A', - scope: true, - replace: true, - //templateUrl: "/reports/partials/reportTable/", - templateUrl: function(scope, elem, attrs) - { - var prefix = elem['urlprefix']; - var the_url = prefix + "/reports/partials/reportTable/"; - return the_url; - }, - link: function(scope, elem, attrs) + var plotterparameter = []; + //Get other plotterparameter + for (var i = 0; i < scope.report.plotterparameter.length; i++) { - var prepend_item = {}; - prepend_item["name"] = "experiment"; - prepend_item["selected"] = true; + plotterparameter.push(scope.report.plotterparameter[i].name); + } - scope.tables_details[attrs.tableid].unshift(prepend_item); + var chart_name = sub_content.name; - angular.forEach(scope.tables_details, function(table_value, table_key) - { - for(var i = 0; i < table_value.length; i++) - { - if(table_value[i].name.indexOf("execution_time") > -1 && - table_value[i].name.indexOf("[s]") == -1) - { - table_value[i].name = table_value[i].name + "[s]"; - } - }; - }); + var legend_experiments = ''; + var alias_experiments = []; + for(var i = 0; i < scope.report.experiments.length; i++) + { + if(i == 0) + legend_experiments = scope.report_experiments_alias[scope.report.experiments[i]]; + else + legend_experiments = legend_experiments+ "&" +scope.report_experiments_alias[scope.report.experiments[i]]; - scope.dattrs = attrs; + alias_experiments.push(scope.report_experiments_alias[scope.report.experiments[i]]); } - }; -}); -//Directive used to generate the dynamic table loading partials -app.directive("myreportinfo", function(){ + var request_data = { + experiment: alias_experiments, + analyzer: [scope.report.analyzer], + output: [chart_name], + plotter: set_plotter, + legend: legend_experiments, + report_number: scope.report.number, + //height: 300, + //width: 400, + }; + + base_url = scope.report.url_prefix; + + var plot_detail = {}; + plot_detail["required_plotter"] = required_plotter; + plot_detail["data"] = { + analyzer: [scope.report.analyzer], + output: [chart_name], + plotter: set_plotter, + }; - return { - restrict: 'E', - scope: true, - replace: true, - //templateUrl: "/reports/partials/reportTable/", - templateUrl: function(scope, elem, attrs) + if(sub_content.selected_template != undefined)// && sub_content.selected_template != "Default") { - var prefix = elem['urlprefix']; - var the_url = prefix + "/reports/partials/reportInfo/"; - return the_url; - }, - link: function(scope, elem, attrs) + plot_detail["selected_template"] = sub_content.selected_template; + request_data.parameter = plot_detail["selected_template"]; + } + else { - }, - controller: ['$scope', function ($scope) { - }], - }; -}); - -//valid code for now -//Directive used to plot a graph -app.directive("plotinfo", function(){ + plot_detail["selected_template"] = sub_content.defaultplotter.parameter; + request_data.parameter = plot_detail["selected_template"]; + } - return { - restrict: 'E', - scope: true, - replace: true, - //templateUrl: "/reports/partials/reportTable/", - templateUrl: function(scope, elem, attrs) + if(sub_content.merged != undefined)// && sub_content.selected_template != "Default") { - var prefix = elem['urlprefix']; - var the_url = prefix + "/plotters/partials/plotinfo/"; - return the_url; - }, - link: function(scope, elem, attrs) + plot_detail["merged"] = sub_content.merged; + request_data.merged = plot_detail["merged"]; + } + else { - var data_to_plot = scope.plotters.selected.sample_data; - $('td#td_' + scope.plotterparameter.name).ready(function(){ - beat.experiments.utils.displayPlot( - scope.url_prefix, - $('td#td_figure_plot')[0], - { - output: scope.plotterparameter, - plotter: scope.plotters.selected.name, - parameter: scope.plotterparameter, - merged: true, - sample_data: scope.plotters.selected.sample_data, - }, - [scope.plotters.selected], // available plotters - true, // replace contents of tag above? - function(){$(this).find('i.fa-spin').hide();}); - }); + plot_detail["merged"] = true; + request_data.merged = plot_detail["merged"]; + } - }, - controller: ['$scope', function ($scope) { - }], - }; -}); + beat.experiments.utils.getPlotData(base_url, + request_data, required_plotter, plotterparameter, content_type, + function(r_image_data, selected_content_type) { + download(r_image_data, chart_id + "." + content_type.toLowerCase(), selected_content_type); + } + ); + } -//Directive used to generate the selector for plotting graph -app.directive("selectplotter", function($compile) -{ - return { - link:function(scope, element, attrs) + + //Retrieve chart from api and display on proper item + function _retrieve_chart(scope, sub_content, container) + { + var required_plotter = []; + var set_plotter = '' + if(sub_content.selected_plotter != undefined) { - element.bind("change", function() + //required_plotter.push(sub_content.selected_plotter); + set_plotter = sub_content.selected_plotter; + var requested_dataformat = ''; + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) { - var plotter_graph_element = document.getElementById('space-for-plotterparameter-graph'); - generate_graph(plotter_graph_element); - - }); + if(scope.report.plotters[i].name == sub_content.selected_plotter) + { + requested_dataformat = scope.report.plotters[i].dataformat; + break; + } + } - function generate_graph(head_id) + //Get default plotter for required dataformat + for (var i = 0; i < scope.report.defaultplotters.length; i++) { - var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" - $(head_id ).empty(); - angular.element(head_id).append($compile(html_div_code)(scope)); + if(scope.report.defaultplotters[i].dataformat == requested_dataformat) + { + sub_content.defaultplotter = scope.report.defaultplotters[i]; + break; + } } - } - }; -}); + required_plotter.push(sub_content.defaultplotter.plotter); -//Directive used to generate the selected plotting graph -app.directive("selectedplotter", function($compile) -{ - return { - link:function(scope, element, attrs) + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) + { + if(scope.report.plotters[i].dataformat == requested_dataformat && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) + { + required_plotter.push(scope.report.plotters[i].name); + } + } + } + else { - var plotter_graph_element = document.getElementById('space-for-plotterparameter-graph'); - generate_graph(plotter_graph_element); + //Get default plotter for required dataformat + for (var i = 0; i < scope.report.defaultplotters.length; i++) + { + if(scope.report.defaultplotters[i].dataformat == sub_content.description) + { + sub_content.defaultplotter = scope.report.defaultplotters[i]; + break; + } + } - function generate_graph(head_id) + required_plotter.push(sub_content.defaultplotter.plotter); + set_plotter = sub_content.defaultplotter.plotter; + + //Get other plotters for required dataformat + for (var i = 0; i < scope.report.plotters.length; i++) { - var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" - $(head_id ).empty(); - angular.element(head_id).append($compile(html_div_code)(scope)); + if(scope.report.plotters[i].dataformat == sub_content.description && scope.report.plotters[i].name != sub_content.defaultplotter.plotter) + { + required_plotter.push(scope.report.plotters[i].name); + } } + } + var plotterparameter = []; + //Get other plotterparameter + for (var i = 0; i < scope.report.plotterparameter.length; i++) + { + plotterparameter.push(scope.report.plotterparameter[i].name); } - }; -}); -//Directive used to handle save plotterparameter click -app.directive("saveplotterparameter", function() -{ - return { - link:function(scope, element, attrs) + var chart_name = sub_content.name; + + var legend_experiments = ''; + var alias_experiments = []; + + for(var i = 0; i < scope.report.experiments.length; i++) { - element.bind("click", function() - { - //console.log(scope); - //console.log(element); - //console.log(attrs); + if(i == 0) + legend_experiments = scope.report_experiments_alias[scope.report.experiments[i]]; + else + legend_experiments = legend_experiments+ "&" +scope.report_experiments_alias[scope.report.experiments[i]]; - //No plotter is selected - if(attrs.plotter == "None") - { - if($("#plotter-selection :selected").text().length == 0) - { - console.log("Please select a plotter first") - } - else - { - //console.log($("#plotter-selection").find(":selected").text()); - console.log(scope.plotters.selected); - scope.plotterparameterData.plotter = scope.plotters.selected.id; + if(Object.keys(scope.$parent.report_experiments_alias_from_content).length === 0) + alias_experiments.push(scope.report_experiments_alias[scope.report.experiments[i]]); + else + alias_experiments.push(scope.report_experiments_alias_from_content[scope.report.experiments[i]]); + } - updatePlotterParameter(); - } - } - else - { - //plotter is selected: parameter tuning - } - }); + var request_data = { + experiment: alias_experiments, + analyzer: [scope.report.analyzer], + output: [chart_name], + plotter: set_plotter, + legend: legend_experiments, + report_number: scope.report.number, + //height: 300, + //width: 400, + }; - function updatePlotterParameter() - { - console.log(scope.plotterparameterData); - scope.plotterparameterFactory.updatePlotterParameter(scope.user, scope.plotterparameter_user, scope.plotterparameter_name, scope.plotterparameter_version, scope.plotterparameterData, scope.url_prefix) - .success(function (reportData) - { - //alert("The report "+ scope.report_id +" has been saved."); + base_url = scope.report.url_prefix; + //scope.plots_details[container.id]; - beat.ui.plotterparameter.plotterparameter_saved('plotterparameter_saved', scope); - }) - .error(function (error) - { - scope.status = 'Unable to update plotterparameter data: ' + error.message; + var plot_detail = {}; + plot_detail["required_plotter"] = required_plotter; + plot_detail["data"] = { + analyzer: [scope.report.analyzer], + output: [chart_name], + plotter: set_plotter, + }; - }); - } + if(sub_content.selected_template != undefined)// && sub_content.selected_template != "Default") + { + plot_detail["selected_template"] = sub_content.selected_template; + request_data.parameter = plot_detail["selected_template"]; + } + else + { + plot_detail["selected_template"] = sub_content.defaultplotter.parameter; + request_data.parameter = plot_detail["selected_template"]; + } + if(sub_content.merged != undefined)// && sub_content.selected_template != "Default") + { + plot_detail["merged"] = sub_content.merged; + request_data.merged = plot_detail["merged"]; + } + else + { + plot_detail["merged"] = true; + request_data.merged = plot_detail["merged"]; } - }; -}); -//Directive used to append parameters -app.directive("plotparams", function($compile){ + scope.plots_details[container.id]= plot_detail; - return { - restrict: 'E', - scope: true, - replace: true, - //templateUrl: "/reports/partials/reportTable/", - templateUrl: function(scope, elem, attrs) + if(scope.report.status == "editable" && scope.report.number != scope.report_number) { - var prefix = elem['urlprefix']; - var the_url = prefix + "/plotters/partials/plotparamsinfo/"; - return the_url; - }, - link: function(scope, elem, attrs) + beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0], + request_data, required_plotter, plotterparameter, false, + + function(r_plotter, r_plotterparameter, r_merged) { + scope.plots_details[container.id]["data"]["plotter"] = r_plotter; + scope.plots_details[container.id]["selected_template"] = r_plotterparameter; + scope.plots_details[container.id]["merged"] = r_merged; + } + ); + } + else { - $('#table_plotparams tr:last').ready(function(){ - var params_from_plotter = scope.$parent.plotters.selected.declaration.parameters; + beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0], + request_data, [], [], false, - //Iterate through each plotter parameters and add them - $.each(params_from_plotter, function( key, value ) { + function(r_plotter, r_plotterparameter, r_merged) { + } + ); + } + } - if(key != "content_type" ) - { - //index in table - var tag_id = (scope.textdata).indexOf(key); - var html_div_code = ''; + function arraysInCommon(arrays) + { + var i, common, + L= arrays.length, min= Infinity; + while(L){ + if(arrays[--L].length<min){ + min= arrays[L].length; + i= L; + } + } + common= arrays.splice(i, 1)[0]; + return common.filter(function(itm, indx){ + if(common.indexOf(itm)== indx){ + return arrays.every(function(arr){ + return arr.indexOf(itm)!= -1; + }); + } + }); + } - var current_value = value.default; - if(key in scope.plotterparams_update) - { - current_value = scope.plotterparams_update[key]; - } + } +}); - if(value.type == "string") - { - console.log(value.default); - console.log(JSON.stringify(value.default)); - console.log(scope); - console.log("icicc"); - console.log("key:"); - console.log(key); - console.log("value:"); - console.log(value); - console.log("-----"); - html_div_code = '<tr><td>'+ key +'</td><td><input id="tag_input_'+ key +'" class="form-control input-sm" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput></td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; - } - else if(value.type == "float64") - { - var minus_button_plus = '<div style="width:15em" class="input-group"><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="minus" buttonplusminus><button type="button" class="btn btn-danger btn-number" data-type="minus" data-field="quant[2]"><span class="glyphicon glyphicon-minus"></span></button></span><input style="text-align:center" id="tag_input_'+ key +'" class="form-control input-number" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="plus" buttonplusminus><button type="button" class="btn btn-success btn-number" data-type="plus" data-field="quant[2]"><span class="glyphicon glyphicon-plus"></span></button></span></div>'; - html_div_code = '<tr><td>'+ key +'</td><td>'+ minus_button_plus +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; - } - else if(value.type == "uint16") - { - var minus_button_plus = '<div style="width:15em" class="input-group"><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="minus" buttonplusminus><button type="button" class="btn btn-danger btn-number" data-type="minus" data-field="quant[2]"><span class="glyphicon glyphicon-minus"></span></button></span><input style="text-align:center" id="tag_input_'+ key +'" class="form-control input-number" type="'+value.type+'" value="' + current_value + '" key="' + key + '" textinput><span class="input-group-btn" id="tag_button_' + key + '" defaultvalue="' + current_value + '" type="'+ value.type +'" key="' + key + '" action="plus" buttonplusminus><button type="button" class="btn btn-success btn-number" data-type="plus" data-field="quant[2]"><span class="glyphicon glyphicon-plus"></span></button></span></div>'; - html_div_code = '<tr><td>'+ key +'</td><td>'+ minus_button_plus +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; - } - else if(value.type == "bool") - { - var bool_param = ''; - if(current_value) - { - bool_param ='<fieldset class="toggle" id="tag_bool_'+ key +'" type="'+value.type+'" value="' + current_value + '" key="' + key + '" toggleparam><input id="data-policy_'+key+'" type="checkbox" checked="checked"><label for="data-policy"><div class="toggle-button"><div class="toggle-tab"></div></div></label></fieldset>'; - } - else - { - bool_param ='<fieldset class="toggle" id="tag_bool_'+ key +'" type="'+value.type+'" value="' + current_value + '" key="' + key + '" toggleparam><input id="data-policy_'+key+'" type="checkbox"><label for="data-policy"><div class="toggle-button"><div class="toggle-tab"></div></div></label></fieldset>'; - } - html_div_code = '<tr><td>'+ key +'</td><td>'+ bool_param +'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'; +//Dynamic tables items +app.directive('item', function ($compile) { + function createTDElement(column) { + var table = angular.element('<table><tr><td class="tableitemspace" thecolumn="' + column + '"></td></tr></table>'); + return table.find('td'); + } - } - else - { - $('#table_plotparams > tbody:last-child').append('<tr><td>'+ key +'</td><td>'+value.default+'</td><td>'+value.type+'</td><td>'+value.description+'</td></tr>'); - } + function render(element, scope) { + var column, html, i; + var columns = scope.$parent.tables_details[scope.$parent.dattrs.tableid]; - angular.element('#table_plotparams > tbody:last-child').append($compile(html_div_code)(scope)); + for (i = 0; i < columns.length ; i++) { + if(i == 0 && columns.length > 0) + { + html = $compile(createTDElement("experiment"))(scope); - } - }); + } + column = columns[i]; + if (column.selected) { + html = $compile(createTDElement(column.name))(scope); + element.append(html); + } + } + } - }); + return { + // restrict: 'A', + scope: { + exp_name: "=", + item: "=", + columns: "=" + }, + compile: function () { + return function (scope, element) { + render(element, scope); + } - //var data_to_plot = scope.plotters.selected.sample_data; - //$('td#td_' + scope.plotterparameter.name).ready(function(){ - // beat.experiments.utils.displayPlot( - // scope.url_prefix, - // $('td#td_figure_plot')[0], - // { - // output: scope.plotterparameter, - // plotter: scope.plotters.selected.name, - // parameter: scope.plotterparameter, - // merged: true, - // sample_data: scope.plotters.selected.sample_data, - // }, - // [scope.plotters.selected], // available plotters - // true, // replace contents of tag above? - // function(){$(this).find('i.fa-spin').hide();}); - //}); + } + }; - }, - controller: ['$scope', function ($scope) { - }], - }; }); -//Directive used to handle textinput -app.directive("textinput", function() -{ - console.log("text changing?"); - return { - link:function(scope, element, attrs) - { - // on blur, update the value in scope - element.bind('propertychange keyup paste', function (blurEvent) { - - console.log(scope); - console.log(element); - console.log(attrs); - var isValid = false; +//Directive used to set proper item value in selected column +app.directive("thecolumn",['$compile', function ($compile) { - if (element.data('old-value') != element.val()) { - console.log('value changed, new value is: ' + element.val()); + return { + scope: { + thecolumn: "@" + }, + restrict: 'A', + template: '{{itemValue}}', + controller: ['$scope', function ($scope) { - var updateValue = element.val(); - //string check - if(attrs.type == "string") - { - isValid = true; - updateValue = element.val(); - } + 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; - //integer check - else if(attrs.type == "uint16") - { - //convert value to integer - updateValue = parseInt(element.val()); - if(isNaN(updateValue)) - { - isValid = false; - alert("Entered value is not a integer"); - } - else - { - isValid = true; - updateValue = parseInt(element.val()); - } + 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; - //float check - else if(attrs.type == "float64") - { - //convert value to float - updateValue = parseFloat(element.val()); - if(isNaN(updateValue)) - { - isValid = false; - alert("Entered value is not a float"); - } - else + if($scope.thecolumn != "experiment") + { + 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[experiment_name].declaration.analyzers)) { - isValid = true; - updateValue = parseFloat(element.val()); + report_experiments[experiment_name].analyzer_block = key_analyzer; + analyzer_block = report_experiments[experiment_name].analyzer_block; } + }); + }); + } + + if($scope.thecolumn.indexOf("execution_time.") == 0) + { + //execution time information + var block_name = $scope.thecolumn.split("execution_time.")[1].split("[s]")[0]; + if(Object.keys(report_experiments[experiment_name].execution_info).length === 0) + { + $scope.itemValue = "-"; + } + else + { + if(report_experiments[experiment_name].execution_info[block_name] == undefined) + { + $scope.itemValue = "-"; } - //check if value is float - //updated models - if(isValid) + else { - scope.plotterparams_update[attrs.key] = updateValue; + $scope.itemValue = (report_experiments[experiment_name].execution_info[block_name].linear_execution_time).toFixed(floating_point_precision.selected);; } - console.log(scope.plotterparams_update); - - //scope.$apply(function () { - // scope.textdirective = element.val(); - // element.data('old-value', element.val()); - //}); } - }); - - } - }; -}); - -//Directive used to handle bool toggle -app.directive("toggleparam", function() -{ - console.log("toggle pressed"); - return { - link:function(scope, element, attrs) - { - element.bind("click", function() + } + else if($scope.thecolumn.indexOf("experiment.") == 0) { - console.log("toggle pressed"); - console.log(scope); - console.log(element); - console.log(attrs); - - if($("#data-policy_"+attrs.key).prop("checked") == true) + //total execution time information + var block_name = $scope.thecolumn.split("execution_time.")[1]; + var total_time = 0; + if(Object.keys(report_experiments[experiment_name].execution_info).length === 0) { - $("#data-policy_"+attrs.key).prop("checked", false); + total_time = "-"; } else { - $("#data-policy_"+attrs.key).prop("checked", true); + angular.forEach(report_experiments[experiment_name].execution_info, function(value, key) + { + total_time += value.linear_execution_time; + }); } - scope.plotterparams_update[attrs.key] = $("#data-policy_"+attrs.key).prop("checked"); - console.log(scope.plotterparams_update); - - }); - } - }; -}); - -//Directive used to handle button plus/minus -app.directive("buttonplusminus", function() -{ - console.log("button +/- pressed"); - return { - link:function(scope, element, attrs) - { - element.bind("click", function() + $scope.itemValue = total_time.toFixed(floating_point_precision.selected); + } + else if($scope.thecolumn.indexOf("algorithm_parameter.") == 0) { - console.log("button +/- pressed"); - console.log(scope); - console.log(element); - console.log(attrs); - console.log(attrs.key); - var tomodify = $("#tag_input_"+attrs.key).val(); - console.log(tomodify); - if(attrs.type == "uint16") + //total execution time information + var block_name = $scope.thecolumn.split("algorithm_parameter.")[1]; + var algorithm_name = block_name.split("__")[0]; + var parameter_name = block_name.split("__")[1]; + if(report_algorithm_parameters_experiment[experiment_name][algorithm_name] != undefined) { - tomodify = parseInt(tomodify); - if(attrs.action == "plus") - { - tomodify = tomodify +1; - } - else if(attrs.action == "minus") + var value = ""; + if(report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name] != undefined) { - tomodify = tomodify -1; + for(var i = 0; i < report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name].length; i++) + { + if(i > 0 && i < report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name].length -1 ) + { + value += ","; + } + value = report_algorithm_parameters_experiment[experiment_name][algorithm_name][parameter_name][i]; + } } - } - else if(attrs.type == "float64") - { - tomodify = parseFloat(tomodify); - if(attrs.action == "plus") + else if(report["all_experiments"][experiment_name]["declaration"]["globals"][algorithm_name][parameter_name] != undefined) { - tomodify = tomodify +0.1; + //get globals value + value = report["all_experiments"][experiment_name]["declaration"]["globals"][algorithm_name][parameter_name]; } - else if(attrs.action == "minus") + else { - tomodify = tomodify -0.1; + //nothing is defined + value = "-"; } - tomodify = tomodify.toFixed(1); + + $scope.itemValue = value; } - $("#tag_input_"+attrs.key).val(tomodify); - scope.plotterparams_update[attrs.key] = tomodify; - console.log(scope.plotterparams_update); - }); - } - }; -}); + else + { + $scope.itemValue = "-"; + } + } + else + { + //results information + $scope.itemValue = (report_experiments[experiment_name].results[analyzer_block][$scope.thecolumn].value).toFixed(floating_point_precision.selected); + } + } + else + { + var experiment_alias = report_experiments_alias[experiment_name]; + $scope.itemValue = experiment_alias; + } + }]//, + //link: function(scope, element, attrs) + //{ + // console.log(scope); + // var report_experiments_alias = scope.$parent.$parent.$parent.$parent.report_experiments_alias; + // var experiment_name = scope.$parent.item; + // var experiment_alias = report_experiments_alias[experiment_name]; + // scope.$watch(scope.$parent.$parent.$parent.$parent.report_experiments_alias,function(newValue, oldValue) + // { + // console.log("changed"); + // console.log(report_experiments_alias); + // console.log(oldValue); + // console.log(newValue); + // }); + // + //} + } +}]); -//Directive used to handle save plotterparameter click -app.directive("plotterparameteritems", function($compile) -{ - return function(scope, element, attrs) - { - scope.$on("addParametersElement", function(event) +//Directive used to generate the dynamic table loading partials +app.directive("tableDynamic", function(){ + + return { + restrict: 'A', + scope: true, + replace: true, + //templateUrl: "/reports/partials/reportTable/", + templateUrl: function(scope, elem, attrs) { - console.log("broadcasted"); - //add the plot - var plotter_graph_element = document.getElementById('space-for-plotterparameter-plot'); - generate_graph(plotter_graph_element); + var prefix = elem['urlprefix']; + var the_url = prefix + "/reports/partials/reportTable/"; + return the_url; + }, + link: function(scope, elem, attrs) + { + var prepend_item = {}; + prepend_item["name"] = "experiment"; + prepend_item["selected"] = true; - //add the parameters - var parameter_elements = document.getElementById('space-for-plotterparameter-items'); - append_plotterparameters(parameter_elements) + scope.tables_details[attrs.tableid].unshift(prepend_item); - //functions to operate on graph and parameters + angular.forEach(scope.tables_details, function(table_value, table_key) + { + for(var i = 0; i < table_value.length; i++) + { + if(table_value[i].name.indexOf("execution_time") > -1 && + table_value[i].name.indexOf("[s]") == -1) + { + table_value[i].name = table_value[i].name + "[s]"; + } + }; + }); - function generate_graph(head_id) - { - var html_div_code = "<plotinfo urlprefix=" + scope.url_prefix +"></plotinfo>" - $(head_id ).empty(); - angular.element(head_id).append($compile(html_div_code)(scope)); - } + scope.dattrs = attrs; + } + }; +}); - function append_plotterparameters(head_id) - { - var html_div_code = "<plotparams urlprefix=" + scope.url_prefix +"></plotparams>" - $(head_id ).empty(); - angular.element(head_id).append($compile(html_div_code)(scope)); - } +//Directive used to generate the dynamic table loading partials +app.directive("myreportinfo", function(){ - }); + return { + restrict: 'E', + scope: true, + replace: true, + //templateUrl: "/reports/partials/reportTable/", + templateUrl: function(scope, elem, attrs) + { + var prefix = elem['urlprefix']; + var the_url = prefix + "/reports/partials/reportInfo/"; + return the_url; + }, + link: function(scope, elem, attrs) + { + }, + controller: ['$scope', function ($scope) { + }], }; }); -//end valid code for now //Directive used to handle table settings click diff --git a/beat/web/plotters/templates/plotterparameters/partials/plotparamsinfo.html b/beat/web/plotters/templates/plotterparameters/partials/plotparamsinfo.html index f1309edaabe01e8a0bb521bdd91360730e8099e6..fe11cec242e817afc8d2746e25ac185d6476dfab 100644 --- a/beat/web/plotters/templates/plotterparameters/partials/plotparamsinfo.html +++ b/beat/web/plotters/templates/plotterparameters/partials/plotparamsinfo.html @@ -38,7 +38,11 @@ <div id="{{ panel_id }}" class="row table-responsive"> <div class="col-sm-12"> <table id="table_plotparams" class="table table-hover table-striped table-condensed"> - Tune your plotterparameters and click the TEST button to see how it looks on the plotter + Tune your plotterparameters and click the wrench button icon to see how it looks on the plotter +<div class="btn-group btn-group-sm action-buttons pull-right"> +<a id="save-button" class="btn btn-default btn-save" data-toggle="tooltip" data-placement="bottom" data-plotter="{{object.plotter}}" title="Test parameters" testplotterparameters><i class="fa fa-wrench fa-lg"></i></a> +</div> + <thead> <tr> <th>