Files
activity-board/dashboard/js/Dashboard.js
Daniel Izquierdo 69387aaa6e wrong dir
2013-07-03 19:45:24 +02:00

365 lines
14 KiB
JavaScript

var Dashboard = {};
(function() {
default_metrics = ['scm_authors','its_closers','mls_senders'];
default_selection = 'companies';
default_companies = ['Rackspace', 'Nebula','Red Hat'];
function getAllProjects(limit, order) {
var projects = {};
$.each(Report.getDataSources(), function(index, ds) {
var repos = ds.getReposData();
if (order) repos = DataProcess.sortRepos(ds,order);
if (limit) repos = repos.slice(0,limit-1);
projects[ds.getName()] = repos;
});
return projects;
}
function getAllCompanies(limit, order) {
var companies = {};
$.each(Report.getDataSources(), function(index, ds) {
var companies_ds = ds.getCompaniesData();
if (order) companies_ds = DataProcess.sortCompanies(ds,order);
if (limit) companies_ds = companies_ds.slice(0,limit-1);
companies[ds.getName()] = companies_ds;
});
return companies;
}
function getAllMetrics(limit) {
var metrics = {};
var not_metrics = ['id','date','month','year','week','unixtime'];
$.each(Report.getDataSources(), function(index, ds) {
var metrics_ds = [];
for (key in ds.getData()) {
if ($.inArray(key,not_metrics) > -1) continue;
metrics_ds.push(key);
}
metrics[ds.getName()] = metrics_ds;
});
return metrics;
}
function getValuesForm(form_name) {
var values = [];
var form = document.getElementById(form_name);
if (form === null) return values;
for (var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox") {
if (form.elements[i].checked === true)
values.push(form.elements[i].value);
}
else if (form.elements[i].type == "select-one") {
for (var j = 0; j < form.elements[i].options.length; j++) {
var option = form.elements[i].options[j];
if (option.selected) values.push(option.value);
}
}
}
return values;
}
// TODO: Breakdown this function when logic grows
Dashboard.selection = function(name, all) {
// TODO: Not supported project+companies filtering
if (name === "companies" && all !== false) cleanSelector("projects");
else if (name === "projects" && all !== false) cleanSelector("companies");
if (all === true || all === false) allSelector(name, all);
if (name==="releases") cleanSelectorList("year");
if (name==="year") cleanSelectorList("releases");
var projects = getValuesForm('form_dashboard_projects');
var companies = getValuesForm('form_dashboard_companies');
if (projects.length === 0 && companies.length === 0) {
$.each(Report.getDataSources(), function (i, ds) {
disableSelector("metrics_"+ds.getName(),false);
});
} else {
// Check data sources has companies or projects data
$.each(Report.getDataSources(), function (i, ds) {
if (name === "companies") {
if (ds.getCompaniesData().length === 0 ) {
cleanSelector("metrics_"+ds.getName());
disableSelector("metrics_"+ds.getName(),true);
}
} else if (name === "projects") {
if (ds.getReposData().length === 0 ||
ds.getName() === "mls"//HACK until projects DS join
) {
cleanSelector("metrics_"+ds.getName());
disableSelector("metrics_"+ds.getName(),true);
}
}
});
}
displayViz();
};
function allSelector(name, status) {
var form_name = "form_dashboard_" + name;
var form = document.getElementById(form_name);
if (form === null) return;
for (var i = 0; i < form.elements.length; i++) {
form.elements[i].checked = status;
}
}
function cleanSelector(name) {
var form_name = "form_dashboard_" + name;
var form = document.getElementById(form_name);
if (form === null) return;
for (var i = 0; i < form.elements.length; i++) {
form.elements[i].checked = false;
}
}
function cleanSelectorList(name) {
var form_name = "form_dashboard_" + name;
var form = document.getElementById(form_name);
if (form === null) return;
var select = form.elements[0];
select.options[0].selected = true;
}
function disableSelector(name, status) {
var form_name = "form_dashboard_" + name;
var form = document.getElementById(form_name);
if (form === null) return;
for (var i = 0; i < form.elements.length; i++) {
form.elements[i].disabled = status;
}
}
function buildSelector(ds, name, options) {
var html = name + "";
html += "<form id='form_dashboard_"+name+"'>";
$.each(options, function(i,option) {
html += '<input type=checkbox name="'+name+'_check_list" value="'
+ option + '" ';
html += 'onClick="Dashboard.selection(\''+name+'\');"';
html += 'id="' + option + '_check" ';
if ($.inArray(option, default_metrics)>-1) html += 'checked ';
if ($.inArray(option, default_companies)>-1) html += 'checked ';
html += '>';
html += option;
html += '<br>';
});
html += '<input type=button value="All" ';
html += 'onClick="Dashboard.selection(\''+name+'\',' + true + ')">';
html += '<input type=button value="None" ';
html += 'onClick="Dashboard.selection(\''+name+'\',' + false + ')">';
html += "</form>";
return html;
}
function cleanName(name) {
// var aux = name.split(".git");
// aux = aux[0];
var aux = name.split("_");
var label = aux.pop();
if (label === "") label = aux.pop();
return label;
}
function displayViz() {
var div = $('#dashboard_viz');
div.empty();
var ds_div = null;
// var ds_div = div.data('ds');
var start = null;
var end = null;
var metrics_selected = {};
$.each(getAllMetrics(), function(ds, ds_metrics) {
metrics_selected[ds] = getValuesForm('form_dashboard_metrics_'+ds);
});
var projects = getValuesForm('form_dashboard_projects');
var companies = getValuesForm('form_dashboard_companies');
var year = getValuesForm('form_dashboard_year').pop();
var release = getValuesForm('form_dashboard_releases').pop();
if (year === "") year = undefined;
else {
year = parseInt(year);
// Old ids format in JSON using months
//start = year*12;
// New format: days since 1970-01-01
// start = (new Date(year.toString()).getTime())/(1000*60*60*24);
// end = (new Date((year+1).toString()).getTime())/(1000*60*60*24);
// New format: seconds since 1970-01-01
start = (new Date(year.toString()).getTime())/1000;
end = (new Date((year+1).toString()).getTime())/1000;
}
if (release === "") release = undefined;
else {
var aux = release.split("_");
start = parseInt(aux[0]);
end = parseInt(aux[1]);
}
var config_metric = {show_desc: false, show_title: true,
show_legend: true, help: false};
$.each(Report.getDataSources(), function(index, ds) {
if (ds_div && ds_div !== ds.getName()) return;
var metrics = metrics_selected[ds.getName()];
$.each(metrics, function(index, metric) {
if (!(metric in ds.getData())) return;
var metric_div = "dashboard_"+ds.getName()+"_"+metric;
var new_div = "<div class='dashboard_graph' id='";
new_div += metric_div+"'></div>";
div.append(new_div);
if (projects.length>0)
ds.displayBasicMetricMyRepos(projects, metric, metric_div,
config_metric, start, end);
else if (companies.length>0)
ds.displayBasicMetricMyCompanies(companies, metric,
metric_div, config_metric, start, end);
else {
config_metric.show_title = false;
var data = ds.getData();
if (year || release) data = DataProcess.filterDates(start, end, data);
Viz.displayBasicMetricsHTML([metric], data,
metric_div, config_metric);
}
});
});
}
var dashboard_divs = {
"filter_companies": {
convert: function() {
var div = $('#filter_companies');
var ds_div = div.data('ds');
var limit = div.data('limit');
var order = div.data('order');
div.append('COMPANIES');
if (limit) div.append(" (top "+limit+")");
div.append("<br>");
$.each(getAllCompanies(limit,order), function(ds, companies) {
if (ds_div && ds_div !== ds) return;
var options = [];
$.each(companies, function(index, company) {
options.push(company);
});
div.append(buildSelector(ds,"companies",options));
});
}
},
"filter_metrics": {
convert: function() {
var div = $('#filter_metrics');
var ds_div = div.data('ds');
var limit = div.data('limit');
div.append('METRICS');
if (limit) div.append(" (top "+limit+")");
div.append("<br>");
$.each(getAllMetrics(limit), function(ds, metrics) {
if (ds_div && ds_div !== ds) return;
var options = [];
$.each(metrics, function(index, metric) {
options.push(metric);
});
// OpenStack does not need mailing list metrics
// https://bugs.launchpad.net/openstack-community/+bug/1183788
if (ds === "mls") return;
div.append(buildSelector(ds,"metrics_"+ds,options));
});
}
},
"filter_projects": {
convert: function() {
var div = $('#filter_projects');
var ds_div = div.data('ds');
var limit = div.data('limit');
var order = div.data('order');
div.append("PROJECTS");
if (limit) div.append(" (top "+limit+")");
div.append("<br>");
$.each(getAllProjects(limit, order), function(ds, projects) {
if (ds_div && ds_div !== ds) return;
var options = [];
$.each(projects, function(index, project) {
options.push(cleanName(project));
});
div.append(buildSelector(ds,"projects",options));
});
}
},
"filter_releases": {
convert: function() {
var name = "releases";
var div = $('#filter_releases');
var msec = 1000;
var releases = {
// Apr 2011-Sep 2011
diablo: {
// start: 2011*12+4,
start: (new Date('2011-04').getTime())/(msec),
end: (new Date('2011-09').getTime())/(msec),
},
essex: {
start: (new Date('2011-09').getTime())/(msec),
end: (new Date('2012-04').getTime())/(msec),
},
folsom: {
start: (new Date('2012-04').getTime())/(msec),
end: (new Date('2012-09').getTime())/(msec),
},
grizzly: {
start: (new Date('2012-09').getTime())/(msec),
end: (new Date('2013-04').getTime())/(msec),
}
};
var html = "<form id='form_dashboard_"+name+"'>";
html += "<select name='releases' ";
html += "onChange=\"Dashboard.selection(\''+name+'\');\">";
html += "<option value=''>releases</option>";
$.each(releases, function(name, data) {
html += "<option value='"+data.start+"_"+data.end+"' ";
html += ">"+name+"</option>";
});
html += "</form>";
div.html(html);
}
},
"filter_year": {
convert: function() {
var name = "year";
var div = $('#filter_year');
var years = ['2010','2011','2012','2013'];
var html = "<form id='form_dashboard_"+name+"'>";
html += "<select name='year' ";
html += "onChange=\"Dashboard.selection(\''+name+'\');\">";
html += "<option value=''>year</option>";
$.each(years, function(i, year) {
html += "<option value='"+year+"' ";
html += ">"+year+"</option>";
});
html += "</form>";
div.html(html);
}
},
"dashboard_viz": {
convert: function() {
Dashboard.selection(default_selection);
}
},
};
Dashboard.build = function() {
$.each (dashboard_divs, function(divid, value) {
if ($("#"+divid).length > 0) value.convert();
});
};
})();
Loader.data_ready(function() {
Dashboard.build();
});