First version

This commit is contained in:
Daniel Izquierdo 2013-05-14 20:06:32 +02:00
parent 5130d6d8b3
commit 1fa9515104
3765 changed files with 76495 additions and 0 deletions

64
VizGrimoireJS/Makefile Normal file
View File

@ -0,0 +1,64 @@
# See the README for installation instructions.
JS_UGLIFY = uglifyjs
JSHINT = jshint
# CSSHINT = csslint
all: \
vizgrimoire.js \
vizgrimoire.min.js \
vizgrimoire.css
.INTERMEDIATE vizgrimoire.js: \
vizgrimoire.deps.js \
vizgrimoire.core.js
.INTERMEDIATE vizgrimoire.css: \
vizgrimoire.deps.css \
vizgrimoire.core.css
vizgrimoire.deps.js: \
src/License.js \
src/envision.js \
src/d3-treemap.min.js \
src/jquery.gridster.js
vizgrimoire.core.js: \
src/Envision_Report.js \
src/Loader.js \
src/Report.js \
src/DataSource.js \
src/Viz.js \
src/ITS.js \
src/MLS.js \
src/SCM.js \
src/Identity.js
vizgrimoire.deps.css: \
src/envision.min.css \
src/jquery.gridster.css
vizgrimoire.core.css: \
src/report.css \
src/report-envision.css
%.min.js: %.js Makefile
@rm -f $@
# $(JS_UGLIFY) -o $@ -c -m $<
$(JS_UGLIFY) -o $@ $<
vizgrimoire%js: Makefile
@rm -f $@
# @$(JSHINT) $(filter %.js,$^)
@cat $(filter %.js,$^) > $@
# @cat $(filter %.js,$^) > $@.tmp
# $(JS_UGLIFY) -o $@ $@.tmp
# @rm $@.tmp
@chmod a-w $@
vizgrimoire%css: Makefile
@rm -f $@
@cat $(filter %.css,$^) > $@
clean:
rm -f vizgrimoire*.js vizgrimoire*.css

View File

@ -0,0 +1,358 @@
var Dashboard = {};
(function() {
default_metrics = ['authors','closers','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 = ds.sortRepos(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 = ds.sortCompanies(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'];
$.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);
}
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};
$.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 = Viz.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);
});
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 day_msec = 1000*60*60*24;
var releases = {
// Apr 2011-Sep 2011
diablo: {
// start: 2011*12+4,
start: (new Date('2011-04').getTime())/(day_msec),
end: (new Date('2011-09').getTime())/(day_msec),
},
essex: {
start: (new Date('2011-09').getTime())/(day_msec),
end: (new Date('2012-04').getTime())/(day_msec),
},
folsom: {
start: (new Date('2012-04').getTime())/(day_msec),
end: (new Date('2012-09').getTime())/(day_msec),
},
grizzly: {
start: (new Date('2012-09').getTime())/(day_msec),
end: (new Date('2013-04').getTime())/(day_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();
});

View File

@ -0,0 +1,799 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
// TODO: Use attributes for getters and setters
function DataSource(name, basic_metrics) {
this.top_data_file = this.data_dir + '/'+this.name+'-top.json';
this.getTopDataFile = function() {
return this.top_data_file;
};
this.basic_metrics = basic_metrics;
this.getMetrics = function() {
return this.basic_metrics;
};
this.data_file = this.data_dir + '/'+this.name+'-evolutionary.json';
this.getDataFile = function() {
return this.data_file;
};
this.setDataFile = function(file) {
this.data_file = file;
};
this.data = null;
this.getData = function() {
return this.data;
};
this.setData = function(load_data, self) {
if (self === undefined) self = this;
self.data = load_data;
};
this.demographics_file = this.data_dir + '/'+this.name+'-demographics.json';
this.getDemographicsFile = function() {
return this.demographics_file;
};
this.demographics_data = null;
this.getDemographicsData = function() {
return this.demographics_data;
};
this.setDemographicsData = function(data, self) {
if (self === undefined) self = this;
self.demographics_data = data;
};
this.data_dir = 'data/json';
this.getDataDir = function() {
return this.data_dir;
};
this.setDataDir = function(dataDir) {
this.data_dir = dataDir;
this.data_file = dataDir + '/'+this.name+'-evolutionary.json';
this.demographics_file = dataDir + '/'+this.name+'-demographics.json';
this.global_data_file = dataDir + '/'+this.name+'-static.json';
this.top_data_file = dataDir + '/'+this.name+'-top.json';
this.companies_data_file = dataDir+'/'+ this.name +'-companies.json';
this.repos_data_file = dataDir+'/'+ this.name +'-repos.json';
this.countries_data_file = dataDir+'/'+ this.name +'-countries.json';
this.time_to_fix_data_file = dataDir+'/'+ this.name +'-quantiles-month-time_to_fix_hour.json';
};
this.global_data_file = this.data_dir + '/'+this.name+'-static.json';
this.getGlobalDataFile = function() {
return this.global_data_file;
};
this.global_data = null;
this.getGlobalData = function() {
return this.global_data;
};
this.setGlobalData = function(data, self) {
if (self === undefined) self = this;
self.global_data = data;
};
this.global_top_data = null;
this.getGlobalTopData = function() {
return this.global_top_data;
};
this.setGlobalTopData = function(data, self) {
if (self === undefined) self = this;
self.global_top_data = data;
};
this.addGlobalTopData = function(data, self, metric, period) {
if (period === undefined) period = "all";
if (self === undefined) self = this;
if (self.global_top_data === null)
self.global_top_data = {};
if (self.global_top_data[metric] === undefined)
self.global_top_data[metric] = {};
self.global_top_data[metric][period] = data;
};
this.name = name;
this.getName = function() {
return this.name;
};
this.people_data_file = this.data_dir + '/'+this.name+'-people.json';
this.getPeopleDataFile = function() {
return this.people_data_file;
};
this.people = null;
this.getPeopleData = function() {
return this.people;
};
this.setPeopleData = function(people, self) {
if (self === undefined) self = this;
self.people = people;
};
this.time_to_fix_data_file = this.data_dir + '/'+this.name
+ '-quantiles-month-time_to_fix_hour.json';
this.getTimeToFixDataFile = function() {
return this.time_to_fix_data_file;
};
this.time_to_fix_data = null;
this.getTimeToFixData = function() {
return this.time_to_fix_data;
};
this.setTimeToFixData = function(data, self) {
if (self === undefined) self = this;
self.time_to_fix_data = data;
};
this.time_to_attention_data_file = this.data_dir + '/'+this.name
+ '-quantiles-month-time_to_attention_hour.json';
this.getTimeToAttentionDataFile = function() {
return this.time_to_attention_data_file;
};
this.time_to_attention_data = null;
this.getTimeToAttentionData = function() {
return this.time_to_attention_data;
};
this.setTimeToAttentionData = function(data, self) {
if (self === undefined) self = this;
self.time_to_attention_data = data;
};
this.project = null;
this.getProject = function() {
return this.project;
};
this.setProject = function(project) {
this.project = project;
};
// Companies data
this.companies_data_file = this.data_dir+'/'+ this.name +'-companies.json';
this.getCompaniesDataFile = function() {
return this.companies_data_file;
};
this.companies = null;
this.getCompaniesData = function() {
return this.companies;
};
this.setCompaniesData = function(companies, self) {
if (companies === null) companies = [];
if (!(companies instanceof Array)) companies=[companies];
if (self === undefined) self = this;
self.companies = companies;
};
this.companies_metrics_data = {};
this.addCompanyMetricsData = function(company, data, self) {
if (self === undefined) self = this;
self.companies_metrics_data[company] = data;
};
this.getCompaniesMetricsData = function() {
return this.companies_metrics_data;
};
this.companies_global_data = {};
this.addCompanyGlobalData = function(company, data, self) {
if (self === undefined) self = this;
self.companies_global_data[company] = data;
};
this.getCompaniesGlobalData = function() {
return this.companies_global_data;
};
this.companies_top_data = {};
this.addCompanyTopData = function(company, data, self, period) {
if (period === undefined) period = "all";
if (self === undefined) self = this;
if (self.companies_top_data[company] === undefined)
self.companies_top_data[company] = {};
self.companies_top_data[company][period] = data;
};
this.getCompaniesTopData = function() {
return this.companies_top_data;
};
this.setCompaniesTopData = function(data, self) {
if (self === undefined) self = this;
self.companies_top_data = data;
};
// Repos data
this.repos_data_file =
this.data_dir+'/'+ this.name +'-repos.json';
this.getReposDataFile = function() {
return this.repos_data_file;
};
this.repos = null;
this.getReposData = function() {
return this.repos;
};
this.setReposData = function(repos, self) {
if (self === undefined) self = this;
if (!(repos instanceof Array)) repos=[repos];
self.repos = repos;
};
this.repos_metrics_data = {};
this.addRepoMetricsData = function(repo, data, self) {
if (self === undefined) self = this;
self.repos_metrics_data[repo] = data;
};
this.getReposMetricsData = function() {
return this.repos_metrics_data;
};
this.repos_global_data = {};
this.addRepoGlobalData = function(repo, data, self) {
if (self === undefined) self = this;
self.repos_global_data[repo] = data;
};
this.getReposGlobalData = function() {
return this.repos_global_data;
};
// Countries data
this.countries_data_file =
this.data_dir+'/'+ this.name +'-countries.json';
this.getCountriesDataFile = function() {
return this.countries_data_file;
};
this.countries = null;
this.getCountriesData = function() {
return this.countries;
};
this.setCountriesData = function(countries, self) {
if (self === undefined) self = this;
self.countries = countries;
};
this.countries_metrics_data = {};
this.addCountryMetricsData = function(country, data, self) {
if (self === undefined) self = this;
self.countries_metrics_data[country] = data;
};
this.getCountriesMetricsData = function() {
return this.countries_metrics_data;
};
this.countries_global_data = {};
this.addCountryGlobalData = function(country, data, self) {
if (self === undefined) self = this;
self.countries_global_data[country] = data;
};
this.getCountriesGlobalData = function() {
return this.countries_global_data;
};
// TODO: Move this login to Report
this.getCompanyQuery = function () {
var company = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "company")
company = querystr.split("&")[0].split("=")[1];
return company;
};
// TODO: data and projects should be in the same dictionary
this.displayBasicHTML = function(div_target, config, title) {
var full_data = [];
var projects = [];
var ds_name = this.getName();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getName() === ds_name) {
if (ds.getData() instanceof Array) return;
full_data.push(ds.getData());
projects.push(ds.getProject());
}
});
Viz.displayBasicHTML(full_data, div_target, this.getTitle(),
this.basic_metrics, this.name+'_hide', config, projects);
};
this.displayBasicMetricCompanies = function(metric_id,
div_target, config, limit, order_by) {
if (order_by === undefined) order_by = metric_id;
var companies_data = this.getCompaniesMetricsData();
if (limit) {
var sorted_companies = this.sortCompanies(order_by);
if (limit > sorted_companies.length)
limit = sorted_companies.length;
var companies_data_limit = {};
for (var i=0; i<limit; i++) {
var company = sorted_companies[i];
companies_data_limit[company] = companies_data[company];
}
companies_data = companies_data_limit;
}
Viz.displayBasicMetricCompaniesHTML(metric_id, companies_data,
div_target, config, limit);
};
this.displayBasicMetricMyCompanies = function(companies, metric_id,
div_target, config, start, end) {
var companies_data = {};
var self = this;
$.each(companies, function(i,name) {
companies_data[name] = self.getCompaniesMetricsData()[name];
});
Viz.displayBasicMetricCompaniesHTML(metric_id, companies_data,
div_target, config, start, end);
};
// TODO: mix with displayBasicMetricCompanies
this.displayBasicMetricRepos = function(metric_id,
div_target, config, limit, order_by) {
if (order_by === undefined) order_by = metric_id;
var repos_data = this.getReposMetricsData();
if (limit) {
var sorted_repos = this.sortRepos(order_by);
if (limit > sorted_repos.length)
limit = sorted_repos.length;
var repos_data_limit = {};
for (var i=0; i<limit; i++) {
var repo = sorted_repos[i];
repos_data_limit[repo] = repos_data[repo];
}
repos_data = repos_data_limit;
}
Viz.displayBasicMetricRepos(metric_id, repos_data,
div_target, config, limit);
};
this.displayBasicMetricMyRepos = function(repos, metric_id,
div_target, config, start, end) {
var repos_data = {};
var self = this;
$.each(repos, function(i,name) {
var metrics = self.getReposMetricsData()[name];
if (!metrics) {
name = Report.getReposMap()[name];
metrics = self.getReposMetricsData()[name];
}
repos_data[name] = metrics;
});
Viz.displayBasicMetricRepos(metric_id, repos_data,
div_target, config, start, end);
};
this.displayBasicMetricCompaniesStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("companies",metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricReposStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("repos", metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricCountriesStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("countries", metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricSubReportStatic = function (report, metric_id,
div_target, config, limit, order_by, show_others) {
if (order_by === undefined) order_by = metric_id;
var data = null;
if (report=="companies")
data = this.getCompaniesGlobalData();
else if (report=="repos")
data = this.getReposGlobalData();
else if (report=="countries")
data = this.getCountriesGlobalData();
else return;
if (limit) {
var sorted = null;
if (report=="companies")
sorted = this.sortCompanies(order_by);
else if (report=="repos")
sorted = this.sortRepos(order_by);
else if (report=="countries")
sorted = this.sortCountries(order_by);
if (limit > sorted.length) limit = sorted.length;
var data_limit = {};
for (var i=0; i<limit; i++) {
var item = sorted[i];
data_limit[item] = data[item];
}
// Add a final companies_data for the sum of other values
if (show_others) {
var others = 0;
for (var i=limit; i<sorted.length; i++) {
var item = sorted[i];
others += data[item][metric_id];
}
data_limit.others = {};
data_limit.others[metric_id] = others;
}
data = data_limit;
}
Viz.displayBasicMetricSubReportStatic(metric_id, data,
div_target, config, limit);
};
this.displayBasicMetricsCompany = function (
company, metrics, div_id, config) {
Viz.displayBasicMetricsCompany(company, metrics,
this.getCompaniesMetricsData()[company], div_id, config);
};
this.displayBasicMetricsRepo = function (repo, metrics, div_id, config) {
Viz.displayBasicMetricsRepo(repo, metrics,
this.getReposMetricsData()[repo], div_id, config);
};
this.displayBasicMetricsCountry = function (country, metrics, div_id, config) {
Viz.displayBasicMetricsCountry(country, metrics,
this.getCountriesMetricsData()[country], div_id, config);
};
this.displayBasicMetrics = function(metric_ids, div_target, config) {
Viz.displayBasicMetricsHTML(metric_ids, this.getData(),
div_target, config);
};
this.displayBasicMetricHTML = function(metric_id, div_target, config) {
var projects = [];
var full_data = [];
var ds_name = this.getName();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getName() === ds_name) {
if (ds.getData() instanceof Array) return;
full_data.push(ds.getData());
projects.push(ds.getProject());
}
});
Viz.displayBasicMetricHTML(this.basic_metrics[metric_id], full_data,
div_target, config, projects);
};
this.displayBasic = function() {
this.basicEvo(this.getData());
};
this.sortCompanies = function(metric_id) {
return this.sortGlobal(metric_id, "companies");
};
this.sortRepos = function(metric_id) {
return this.sortGlobal(metric_id, "repos");
};
this.sortCountries = function(metric_id) {
return this.sortGlobal(metric_id, "countries");
};
this.sortGlobal = function (metric_id, kind) {
if (metric_id === undefined) metric_id = "commits";
var metric = [];
var sorted = [];
var global = null;
if (kind === "companies") {
global = this.getCompaniesGlobalData();
if (this.getCompaniesData().length === 0) return sorted;
if (global[this.getCompaniesData()[0]][metric_id] === undefined)
metric_id = "commits";
}
else if (kind === "repos") {
global = this.getReposGlobalData();
if (this.getReposData().length === 0) return sorted;
if (global[this.getReposData()[0]][metric_id] === undefined)
metric_id = "commits";
}
else if (kind === "countries") {
global = this.getCountriesGlobalData();
if (this.getCountriesData().length === 0) return sorted;
if (global[this.getCountriesData()[0]][metric_id] === undefined)
metric_id = "commits";
}
$.each(global, function(item, data) {
metric.push([item, data[metric_id]]);
});
metric.sort(function(a, b) {return b[1] - a[1];});
$.each(metric, function(id, value) {
sorted.push(value[0]);
});
return sorted;
};
this.displayCompaniesNav = function (div_nav, sort_metric) {
var nav = "<span id='nav'></span>";
var sorted_companies = this.sortCompanies(sort_metric);
$.each(sorted_companies, function(id, company) {
nav += "<a href='#"+company+"-nav'>"+company + "</a> ";
});
$("#"+div_nav).append(nav);
};
this.displayCompaniesLinks = function (div_links, limit, sort_metric) {
var sorted_companies = this.sortCompanies(sort_metric);
var links = "";
var i = 0;
$.each(sorted_companies, function(id, company) {
links += '<a href="company.html?company='+company+'">'+company+'</a> | ';
if (i++>limit) return false;
});
$("#"+div_links).append(links);
};
this.displayCountriesNav = function (div_nav, sort_metric) {
var nav = "<span id='nav'></span>";
var sorted_countries = this.sortCountries(sort_metric);
$.each(sorted_countries, function(id, country) {
nav += "<a href='#"+country+"-nav'>"+country + "</a> ";
});
$("#"+div_nav).append(nav);
};
this.displayReposNav = function (div_nav, sort_metric, scm_and_its) {
var nav = "<span id='nav'></span>";
var sorted_repos = this.sortRepos(sort_metric);
$.each(sorted_repos, function(id, repo) {
if (scm_and_its && (!(Report.getReposMap()[repo]))) return;
nav += "<a href='#" + repo + "-nav'>";
var label = repo;
if (repo.lastIndexOf("http") === 0) {
var aux = repo.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
// label = repo.substr(repo.lastIndexOf("_") + 1);
}
else if (repo.lastIndexOf("<") === 0)
label = MLS.displayMLSListName(repo);
nav += label;
nav += "</a> ";
});
$("#" + div_nav).append(nav);
};
this.displayCompaniesList = function (metrics,div_id,
config_metric, sort_metric) {
this.displaySubReportList("companies",metrics,div_id,
config_metric, sort_metric);
};
this.displayReposList = function (metrics,div_id,
config_metric, sort_metric, scm_and_its) {
this.displaySubReportList("repos",metrics,div_id,
config_metric, sort_metric, scm_and_its);
};
this.displayCountriesList = function (metrics,div_id,
config_metric, sort_metric) {
this.displaySubReportList("countries",metrics,div_id,
config_metric, sort_metric);
};
this.displaySubReportList = function (report, metrics,div_id,
config_metric, sort_metric, scm_and_its) {
var list = "";
var ds = this;
var data = null, sorted = null;
if (report === "companies") {
data = this.getCompaniesMetricsData();
sorted = this.sortCompanies(sort_metric);
}
else if (report === "repos") {
data = this.getReposMetricsData();
sorted = this.sortRepos(sort_metric);
}
else if (report === "countries") {
data = this.getCountriesMetricsData();
sorted = this.sortCountries(sort_metric);
}
else return;
// Preserve order when float right
metrics.reverse();
$.each(sorted, function(id, item) {
if (scm_and_its && (!(Report.getReposMap()[item]))) return;
list += "<div class='subreport-list' id='"+item+"-nav'>";
list += "<div style='float:left;'>";
if (report === "companies")
list += "<a href='company.html?company="+item+"'>";
else if (report === "repos") {
list += "<a href='";
// Show together SCM and ITS
if ((ds.getName() === "scm" || ds.getName() === "its") &&
(Report.getReposMap().length === undefined)) ;
else
list += ds.getName()+"-";
list += "repository.html";
list += "?repository="+item;
list += "&data_dir=" + Report.getDataDir();
list += "'>";
}
else if (report === "countries") {
list += "<a href='"+ds.getName();
list += "-country.html?country="+item;
list += "&data_dir=" + Report.getDataDir();
list += "'>";
}
list += "<strong>";
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
// label = item.substr(item.lastIndexOf("_") + 1);
}
else if (item.lastIndexOf("<") === 0)
label = MLS.displayMLSListName(item);
list += label;
list += "</strong> +info</a>";
list += "<br><a href='#nav'>^</a>";
list += "</div>";
$.each(metrics, function(id, metric) {
list += "<div id='"+item+"-"+metric+"'";
list +=" class='subreport-list-item'></div>";
});
list += "</div>";
});
$("#"+div_id).append(list);
// Draw the graphs
$.each(sorted, function(id, item) {
if (scm_and_its && (!(Report.getReposMap()[item]))) return;
$.each(metrics, function(id, metric) {
var item_data = data[item];
if (item_data[metric] === undefined && report === "repos") {
// Hack to support showing ITS+SCM metrics in repos
var map_repo = Report.getReposMap()[item];
if (map_repo) {
new_data = ds.getITS().getReposMetricsData()[map_repo];
item_data = new_data;
}
else return;
}
var div_id = item+"-"+metric;
var items = {};
items[item] = item_data;
var title = metric;
Viz.displayMetricSubReportLines(div_id, metric, items, title);
});
});
};
this.displayCompanySummary = function(divid, company, ds) {
this.displaySubReportSummary("companies",divid, company, ds);
};
this.displayRepoSummary = function(divid, repo, ds) {
this.displaySubReportSummary("repositories",divid, repo, ds);
};
this.displayCountrySummary = function(divid, repo, ds) {
this.displaySubReportSummary("countries",divid, repo, ds);
};
this.displayCompaniesSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total companies: " + data.companies +"<br>";
html += "Companies in 2006: " + data.companies_2006+"<br>";
html += "Companies in 2009: " + data.companies_2009+"<br>";
html += "Companies in 2012: " + data.companies_2012+"<br>";
$("#"+divid).append(html);
};
this.displaySubReportSummary = function(report, divid, item, ds) {};
this.displayReposSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total repositories: " + data.repositories +"<br>";
$("#"+divid).append(html);
};
this.displayCountriesSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total countries: " + data.countries +"<br>";
$("#"+divid).append(html);
};
this.displayDemographics = function(divid, file, period) {
Viz.displayDemographics(divid, this, file, period);
};
this.displayTimeToAttention = function(div_id, column, labels, title) {
var labels = true;
var title = "Time to Attention " + column;
Viz.displayTimeToAttention(div_id, this.getTimeToAttentionData(), column, labels, title);
};
this.displayTimeToFix = function(div_id, column, labels, title) {
var labels = true;
var title = "Time to Fix " + column;
Viz.displayTimeToFix(div_id, this.getTimeToFixData(), column, labels, title);
};
this.displayTop = function(div, all, show_metric, graph) {
if (all === undefined) all = true;
Viz.displayTop(div, this, all, show_metric, graph);
};
this.displayTopBasic = function(div, action, doer, graph) {
Viz.displayTopBasic(div, this, action, doer, graph);
};
this.displayTopCompany = function(company, div, metric, period, titles) {
Viz.displayTopCompany(company, div, this, metric, period, titles);
};
this.displayTopGlobal = function(div, metric, period, titles) {
Viz.displayTopGlobal(div, this, metric, period, titles);
};
this.basicEvo = function(history) {
for (var id in this.basic_metrics) {
var metric = this.basic_metrics[id];
if ($.inArray(metric.column, Report.getConfig()[this.getName()+"_hide"]) > -1)
continue;
if ($('#' + metric.divid).length)
Viz.displayBasicLines(metric.divid, history, metric.column,
true, metric.name);
}
};
this.envisionEvo = function(div_id, history, relative) {
config = Report.getConfig();
var options = Viz.getEnvisionOptions(div_id, history, this.getName(),
Report.getConfig()[this.getName()+"_hide"]);
if (relative)
Viz.addRelativeValues(options.data, this.getMainMetric());
new envision.templates.Envision_Report(options, [ this ]);
};
this.displayEvo = function(divid, relative) {
var projects_full_data = Report.getProjectsDataSources();
this.envisionEvo(divid, projects_full_data, relative);
};
}

View File

@ -0,0 +1,286 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
(function() {
var V = envision, global_data = {};
function getDefaultsMarkers(option, markers, dates) {
var mark = "";
if (!markers || markers.length === 0) return mark;
for ( var i = 0; i < markers.date.length; i++) {
if (markers.date[i] == dates[option.index]) {
mark = markers.marks[i];
}
}
return mark;
}
function getEnvisionDefaultsGraph(name, gconfig) {
var graph = {
name : name,
config : {
colors : gconfig.colors,
grid: {verticalLines:false, horizontalLines:false},
mouse : {
// container: $("#all-envision-legend"),
track : true,
trackY : false,
position : 'ne'
},
yaxis : {
min : 0,
autoscale : true
},
legend : {
show: false,
backgroundColor : '#FFFFFF',
backgroundOpacity : 0
},
}
};
if (gconfig.gtype === "whiskers")
graph.config.whiskers = {
show : true,
lineWidth : 2
};
else
graph.config['lite-lines'] = {
lineWidth : 2,
show : true,
fill : false,
fillOpacity : 0.5
};
if (gconfig.y_labels)
graph.config.yaxis = {
showLabels : true,
min : 0
};
if (gconfig.show_markers)
graph.config.markers = {
show : true,
position : 'ct',
labelFormatter : function(o) {
return getDefaultsMarkers(o, gconfig.markers, gconfig.dates);
}
};
return graph;
}
function getDefaultsMetrics(DS, viz, metrics, default_config) {
$.each(metrics, function(metric, value) {
config = default_config;
if (value.envision)
config = Viz.mergeConfig(default_config,
value.envision);
if ($.inArray(metric, global_data.envision_hide) === -1) {
viz[metric] = getEnvisionDefaultsGraph
('report-' + DS.getName() + '-' + metric, config);
viz[metric].config.subtitle = metric;
if (DS.getMainMetric() == metric) {
// Create graph also for relative data
viz[metric+"_relative"] = getEnvisionDefaultsGraph
('report-' + DS.getName() + '-' + metric+"_relative", config);
viz[metric].config['lite-lines'] = {show:false};
viz[metric].config['lines'] = {
lineWidth : 1,
show : true,
stacked: true,
fill : true,
fillOpacity : 1
};
}
}
});
}
function getDefaults(ds) {
//var defaults_colors = [ '#ffa500', '#ffff00', '#00ff00', '#4DA74D',
// '#9440ED' ];
var defaults_colors = [ '#ffa500', '#00A8F0', '#C0D800', '#ffff00', '#00ff00', '#4DA74D',
'#9440ED' ];
var default_config = {
colors : defaults_colors,
dates : global_data.dates,
g_type : '',
markers : global_data.markers,
y_labels : false
};
var data_sources = Report.getDataSources();
var viz = {};
var metrics = {};
if (!ds) {
$.each(data_sources, function(i, DS) {
metrics = DS.getMetrics();
getDefaultsMetrics(DS, viz, metrics, default_config);
});
} else {
$.each(data_sources, function(i, DS) {
if ($.inArray(DS.getName(), ds) > -1) {
metrics = DS.getMetrics();
getDefaultsMetrics(DS, viz, metrics, default_config);
}
});
}
config = default_config;
viz.summary = getEnvisionDefaultsGraph('report-summary', config);
viz.summary.config.xaxis = {
noTickets : 10,
showLabels : true
};
viz.summary.config.handles = {
show : true
};
viz.summary.config.selection = {
mode : 'x'
};
viz.summary.config.mouse = {};
viz.connection = {
name : 'report-connection',
adapterConstructor : V.components.QuadraticDrawing
};
return viz;
}
function getOrderedDataSources(ds_list, main_metric) {
var ordered = [];
var main_DS = null;
$.each(ds_list, function(i, DS) {
if (DS.getMetrics()[main_metric]) {
main_DS = DS;
return false;
}
});
ordered.push(main_DS);
$.each(ds_list, function(i, DS) {
if (DS===main_DS) return;
ordered.push(DS);
});
return ordered;
}
function Envision_Report(options, data_sources) {
var main_metric = options.data.main_metric;
global_data = options.data;
if (!data_sources) data_sources = Report.getDataSources();
data_sources = getOrderedDataSources(data_sources, main_metric);
var ds = [];
for ( var i = 0; i < data_sources.length; i++) {
if (data_sources[i].getData().length === 0) continue;
ds.push(data_sources[i].getName());
}
var data = options.data, defaults = getDefaults(ds),
vis = new V.Visualization(
{
name : 'report-' + ds.join(",")
}), selection = new V.Interaction(), hit = new V.Interaction();
var metrics = {};
$.each(data_sources, function(i, DS) {
if (DS.getData().length === 0) return;
metrics = $.extend(metrics, DS.getMetrics());
});
$.each(metrics, function(metric, value) {
if ($.inArray(metric, data.envision_hide) !== -1) return;
if (data[metric] === undefined) return;
defaults[metric].data = data[metric];
// The legend is different if the metric is not in all projects
if (defaults[metric].data.length <
Report.getProjectsList().length)
defaults[metric].config.legend.show = true;
if (data[metric+"_relative"])
defaults[metric].data = data[metric+"_relative"];
});
defaults.summary.data = data.summary;
// SHOW MOUSE LEGEND AND LEGEND
defaults[main_metric].config.legend.show = true;
defaults[main_metric].config.mouse.trackFormatter = options.trackFormatter;
if (options.xTickFormatter) {
defaults.summary.config.xaxis.tickFormatter = options.xTickFormatter;
}
defaults[main_metric].config.yaxis.tickFormatter = options.yTickFormatter ||
function(n) {
return '$' + n;
};
// ENVISION COMPONENTS
var components = {};
$.each(metrics, function(metric, value) {
if (data[metric] === undefined) return;
if ($.inArray(metric, data.envision_hide) === -1) {
components[metric] = new V.Component(defaults[metric]);
}
});
connection = new V.Component(defaults.connection);
summary = new V.Component(defaults.summary);
// VISUALIZATION
$.each(components, function(component, value) {
vis.add(value);
});
vis
.add(connection).add(summary)
.render(options.container);
// ZOOMING
$.each(components, function(component, value) {
selection.follower(value);
});
selection.follower(connection).leader(summary).add(V.actions.selection,
options.selectionCallback ? {
callback : options.selectionCallback
} : null);
// HIT
var hit_group = [];
$.each(components, function(component, value) {
hit_group.push(value);
});
hit.group(hit_group).add(V.actions.hit);
// INITIAL SELECTION
if (options.selection) {
summary.trigger('select', options.selection);
}
}
V.templates.Envision_Report = Envision_Report;
})();

180
VizGrimoireJS/src/ITS.js Normal file
View File

@ -0,0 +1,180 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function ITS() {
var basic_metrics = {
'opened' : {
'divid' : 'its-opened',
'column' : "opened",
'name' : "Opened",
'desc' : "Number of opened tickets",
'envision' : {
y_labels : true,
show_markers : true
}
},
'openers' : {
'divid' : 'its-openers',
'column' : "openers",
'name' : "Openers",
'desc' : "Unique identities opening tickets",
'action' : "opened",
'envision' : {
gtype : 'whiskers'
}
},
'closed' : {
'divid' : 'its-closed',
'column' : "closed",
'name' : "Closed",
'desc' : "Number of closed tickets"
},
'closers' : {
'divid' : 'its-closers',
'column' : "closers",
'name' : "Closers",
'desc' : "Number of identities closing tickets",
'action' : "closed",
'envision' : {
gtype : 'whiskers'
}
},
'changed' : {
'divid' : 'its-changed',
'column' : "changed",
'name' : "Changed",
'desc' : "Number of changes to the state of tickets"
},
'changers' : {
'divid' : 'its-changers',
'column' : "changers",
'name' : "Changers",
'desc' : "Number of identities changing the state of tickets",
'action' : "changed",
'envision' : {
gtype : 'whiskers'
}
}
};
this.getMetrics = function() {return basic_metrics;};
this.getMainMetric = function() {
return "opened";
};
this.setReposData = function(repos_name, self) {
if (self === undefined) self = this;
if (!(repos_name instanceof Array)) repos_name=[repos_name];
var repos = [];
// convert http://issues.liferay.com/browse/AUI, change "/" by "_"
for (var i=0; i<repos_name.length; i++) {
repos.push(repos_name[i].replace(/\//g,"_"));
}
self.repos = repos;
};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0)
label = item.substr(item.lastIndexOf("_") + 1);
var html = "<h1>" + label + "</h1>";
var id_label = {
opened : "Opened",
openers : "Openers",
first_date : "Start",
last_date : "End",
closers : "Closers",
closed : "Closed",
changers : "Changers",
changed: "Changed",
tickets: "Tickets",
trackers: "Trackers"
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
else if (report === "countries")
global_data = ds.getCountriesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .its-info').hide();
return;
}
$(div_id + ' #its_type').text(this.global_data.type);
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().its_url;
}
if (this.global_data.type === "allura")
url = url.replace("rest/","");
else if (this.global_data.type === "github") {
url = url.replace("api.","");
url = url.replace("repos/","");
}
$(div_id + ' #its_url').attr("href", url);
$(div_id + ' #its_name').text("Tickets " + this.global_data.type);
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #itsFirst').text(data.first_date);
$(div_id + ' #itsLast').text(data.last_date);
$(div_id + ' #itsTickets').text(data.tickets);
$(div_id + ' #itsOpeners').text(data.openers);
$(div_id + ' #itsRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #itsRepositories').hide();
};
this.getTitle = function() {return "Tickets";};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "opened", "openers", radius);
};
}
var aux = new ITS();
ITS.prototype = new DataSource("its", aux.getMetrics());

View File

@ -0,0 +1,110 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Identity = {};
(function() {
var unique_list = "unique-sortable";
function sortSelList(list_divid, list, name) {
var connect = "";
list_divid === unique_list ? connect ="" : connect = unique_list;
$('#'+name).sortable({
handle: ".handle",
connectWith: "#"+connect,
start: function(e, info) {
info.item.siblings(".ui-selected").appendTo(info.item);
},
stop: function(e, info) {
if (info.item.parent()[0].id === unique_list)
info.item.find('.handle').remove();
info.item.parent().append(info.item.find("li"));
info.item.parent().find("li")
.addClass("mjs-nestedSortable-leaf");
// TODO remove from data source filtering data
}
}).selectable()
.find('li')
.prepend( "<div class='handle'></div>" );
}
Identity.showListNested = function(list_divid, ds) {
list ='<ol id='+unique_list+' class="nested_sortable" ';
list += 'style="padding: 5px; background: #eee;"></ol>';
$('#'+list_divid).append(list);
$('#'+unique_list).nestedSortable({
forcePlaceholderSize: true,
handle: 'div',
helper: 'clone',
items: 'li',
tolerance: 'pointer',
toleranceElement: '> div',
maxLevels: 2,
isTree: true,
expandOnHover: 700,
startCollapsed: true
});
$('.disclose').on('click', function() {
$(this).closest('li').toggleClass('mjs-nestedSortable-collapsed')
.toggleClass('mjs-nestedSortable-expanded');
});
};
function showFilter (ds, filter_data) {
$('#'+ds.getName()+'filter').autocomplete({
source: filter_data,
select: function( event, ui ) {
$("#"+ds.getName()+"filter").val('');
$("#"+ds.getName()+"_people_"+ui.item.value).addClass('ui-selected');
return false;
}
});
}
Identity.showList = function(list_divid, ds) {
var list ="";
var people = ds.getPeopleData();
var filter_data = [];
list ='<ol id="'+ds.getName()+'-sortable" class="sortable">';
for (var i=0; i<people.id.length; i++) {
var value = people.id[i];
if (typeof value === "string") {
value = value.replace("@", "_at_").replace(".","_");
}
filter_data.push({value:value, label:people.name[i]});
list += '<li id="'+ds.getName()+'_people_'+value+'" ';
list += 'class="ui-widget-content ui-selectee">';
list += '<div><span class="disclose"><span></span></span>';
list += people.id[i] +' ' + people.name[i];
list += '</div></li>';
}
list += '</ol>';
$('#'+list_divid).append("<input id='"+ds.getName()+"filter'>");
showFilter(ds, filter_data);
$('#'+list_divid).append(list);
sortSelList(list_divid, list, ds.getName()+"-sortable");
};
})();

View File

@ -0,0 +1,31 @@
/*
* VizGrimoire.js - https://github.com/VizGrimoire/VizGrimoireJS
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*
* Underscore.js 1.1.7 (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. MIT license
* bean.js - copyright Jacob Thornton 2011, MIT license
* Flotr2 (c) 2012 Carl Sutherland, MIT license
* Bonzo: DOM Utility (c) Dustin Diaz 2011, MIT license
* Envision.js (c) 2012 Carl Sutherland, Humble Software, MIT license
* gridster.js Copyright (c) 2012 ducksboard; Licensed MIT
* d3.js: Copyright (c) 2012, Michael Bostocks
*
*/
;

385
VizGrimoireJS/src/Loader.js Normal file
View File

@ -0,0 +1,385 @@
/*
* Copyright (C) 2012-2013 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Loader = {};
(function() {
var data_callbacks = [];
var data_global_callbacks = [];
var check_companies = false, check_repos = false, check_countries = false;
Loader.data_ready = function(callback) {
data_callbacks.push(callback);
};
Loader.data_ready_global = function(callback) {
data_global_callbacks.push(callback);
};
Loader.data_load = function () {
data_load_file(Report.getProjectFile(),
function(data, self) {Report.setProjectData(data);});
data_load_file(Report.getConfigFile(),
function(data, self) {Report.setConfig(data);});
data_load_file(Report.getMarkersFile(),
function(data, self) {Report.setMarkers(data);});
var projects_dirs = Report.getProjectsDirs();
for (var i=0; i<projects_dirs.length; i++) {
var data_dir = projects_dirs[i];
var prj_file = Report.getDataDir() + "/project-info.json";
data_load_file(prj_file, function(data, dir) {
if (data.project_name === undefined) {
data.project_name = dir.replace("data/json","")
.replace(/\.\.\//g,"");
}
var projects_data = Report.getProjectsData();
projects_data[data.project_name] = {dir:dir,url:data.project_url};
}, data_dir);
}
data_load_companies();
data_load_repos();
data_load_countries();
data_load_metrics();
data_load_people();
data_load_tops('authors');
data_load_time_to_fix();
data_load_time_to_attention();
};
function data_load_companies() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getCompaniesDataFile(),
DS.setCompaniesData, DS);
});
}
function data_load_file(file, fn_data_set, self) {
$.when($.getJSON(file)).done(function(history) {
fn_data_set(history, self);
end_data_load();
}).fail(function() {
fn_data_set([], self);
end_data_load();
});
};
function data_load_repos() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getReposDataFile(), DS.setReposData, DS);
});
// Repositories mapping between data sources
data_load_file(Report.getReposMapFile(), Report.setReposMap);
};
function data_load_countries() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getCountriesDataFile(), DS.setCountriesData, DS);
});
};
function data_load_time_to_fix() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getTimeToFixDataFile(), DS.setTimeToFixData, DS);
});
};
function data_load_time_to_attention() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getTimeToAttentionDataFile(), DS.setTimeToAttentionData, DS);
});
};
// TODO: It is better to have all the tops in the same file
// we should move data load from Viz.displayTop here
function data_load_tops(metric) {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
// TODO: Support for SCM only in Webkit
if (DS.getName() !== "scm") {
DS.setGlobalTopData([], DS);
return;
}
var file_static = DS.getDataDir() + "/"+ DS.getName()+"-top-"+metric;
var file_all = file_static + ".json";
var file_2006 = file_static + "_2006.json";
var file_2009 = file_static + "_2009.json";
var file_2012 = file_static + "_2012.json";
$.when($.getJSON(file_all),
$.getJSON(file_2006),
$.getJSON(file_2009),
$.getJSON(file_2012)
).done(function(history, hist2006, hist2009, hist2012) {
DS.addGlobalTopData(history[0], DS, metric, "all");
DS.addGlobalTopData(hist2006[0], DS, metric, "2006");
DS.addGlobalTopData(hist2009[0], DS, metric, "2009");
DS.addGlobalTopData(hist2012[0], DS, metric, "2012");
end_data_load();
}).fail(function() {
DS.setGlobalTopData([], DS);
end_data_load();
});
});
};
function data_load_companies_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var companies = DS.getCompaniesData();
if (!companies) return;
$.each(companies, function(i, company) {
var file = DS.getDataDir()+"/"+company+"-";
var file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addCompanyMetricsData(company, history, DS);
end_data_load();
});
var file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addCompanyGlobalData(company, history, DS);
end_data_load();
});
var file_static = file + DS.getName()+"-top-";
if (DS.getName() === "scm") file_static += "authors";
if (DS.getName() === "its") file_static += "closers";
if (DS.getName() === "mls") file_static += "senders";
var file_all = file_static + ".json";
$.when($.getJSON(file_all))
.done(function(history) {
DS.addCompanyTopData(company, history, DS, "all");
end_data_load();
}).fail(function() {
DS.setCompaniesTopData([], self);
end_data_load();
});
});
});
}
function data_load_repos_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var repos = DS.getReposData();
if (repos === null) return;
$.each(repos, function(i, repo) {
var file = DS.getDataDir()+"/"+repo+"-";
file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addRepoMetricsData(repo, history, DS);
end_data_load();
});
file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addRepoGlobalData(repo, history, DS);
end_data_load();
});
});
});
}
function data_load_countries_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var countries = DS.getCountriesData();
if (countries === null) return;
$.each(countries, function(i, country) {
var file = DS.getDataDir()+"/"+country+"-";
file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addCountryMetricsData(country, history, DS);
end_data_load();
});
file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addCountryGlobalData(country, history, DS);
end_data_load();
});
});
});
}
function data_load_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getDataFile(), DS.setData, DS);
data_load_file(DS.getGlobalDataFile(), DS.setGlobalData, DS);
// TODO: Demographics just for SCM yet!
if (DS instanceof SCM) {
data_load_file(DS.getDemographicsFile(), DS.setDemographicsData, DS);
}
if (DS instanceof MLS) {
data_load_file(DS.getListsFile(), DS.setListsData, DS);
}
});
}
function data_load_people() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getPeopleDataFile(), DS.setPeopleData, DS);
});
}
function check_companies_loaded(DS) {
if (DS.getCompaniesData() === null) return false;
else {
if (DS.getCompaniesData().length>0 && !check_companies) {
check_companies = true;
data_load_companies_metrics();
return false;
}
}
if (check_companies && DS.getCompaniesData().length>0) {
var companies_loaded = 0;
for (var key in DS.getCompaniesMetricsData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
companies_loaded = 0;
for (var key in DS.getCompaniesGlobalData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
if (DS.getCompaniesTopData() === null) return false;
companies_loaded = 0;
for (var key in DS.getCompaniesTopData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
}
return true;
}
function check_repos_loaded(DS) {
if (DS.getReposData() === null) return false;
else {
if (DS.getReposData().length>0 && !check_repos) {
check_repos = true;
data_load_repos_metrics();
return false;
}
}
if (check_repos && DS.getReposData().length>0) {
var repos_loaded = 0;
for (var key in DS.getReposMetricsData()) {repos_loaded++;}
if (repos_loaded !== DS.getReposData().length) return false;
repos_loaded = 0;
for (var key in DS.getReposGlobalData()) {repos_loaded++;}
if (repos_loaded !== DS.getReposData().length) return false;
}
return true;
}
function check_countries_loaded(DS) {
if (DS.getCountriesData() === null) return false;
else {
if (DS.getCountriesData().length>0 && !check_countries) {
check_countries = true;
data_load_countries_metrics();
return false;
}
}
if (check_countries && DS.getCountriesData().length>0) {
var countries_loaded = 0;
for (var key in DS.getCountriesMetricsData()) {countries_loaded++;}
if (countries_loaded !== DS.getCountriesData().length) return false;
countries_loaded = 0;
for (var key in DS.getCountriesGlobalData()) {countries_loaded++;}
if (countries_loaded !== DS.getCountriesData().length) return false;
}
return true;
}
function check_projects_loaded() {
var projects_loaded = 0;
var projects_data = Report.getProjectsData();
var projects_dirs = Report.getProjectsDirs();
for (var key in projects_data) {projects_loaded++;}
if (projects_loaded < projects_dirs.length ) return false;
return true;
}
function check_data_loaded_global() {
var check = true;
if (Report.getProjectData() === null ||
Report.getConfig() === null || Report.getMarkers() === null)
return false;
if (!(check_projects_loaded())) return false;
var data_sources = Report.getDataSources();
$.each(data_sources, function(index, DS) {
if (DS.getData() === null) {check = false; return false;}
if (DS.getGlobalData() === null) {check = false; return false;}
if (DS.getGlobalTopData() === null) {check = false; return false;}
if (DS.getTimeToFixData() === null) {check = false; return false;}
});
return check;
}
function check_data_loaded() {
var check = true;
if (!(check_data_loaded_global())) return false;
var data_sources = Report.getDataSources();
$.each(data_sources, function(index, DS) {
if (DS.getPeopleData() === null) {check = false; return false;}
if (!check_companies_loaded(DS)) {check = false; return false;}
if (!check_repos_loaded(DS)) {check = false; return false;}
if (!check_countries_loaded(DS)) {check = false; return false;}
// TODO: Demographics just for SCM yet!
if (DS instanceof SCM) {
if (DS.getDemographicsData() === null) {check = false; return false;}
}
if (DS instanceof MLS) {
if (DS.getListsData() === null) {check = false; return false;}
}
});
return check;
}
// Two steps data loading
function end_data_load() {
if (check_data_loaded_global()) {
for ( var i = 0; i < data_global_callbacks.length; i++) {
data_global_callbacks[i]();
}
data_global_callbacks = [];
}
if (check_data_loaded()) {
// Invoke callbacks informing all data needed has been loaded
for ( var i = 0; i < data_callbacks.length; i++) {
data_callbacks[i]();
}
}
};
})();

500
VizGrimoireJS/src/MLS.js Normal file
View File

@ -0,0 +1,500 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function MLS() {
var self = this;
var basic_metrics = {
'sent' : {
'divid' : "mls-sent",
'column' : "sent",
'name' : "Sent",
'desc' : "Number of messages"
},
'senders' : {
'divid' : "mls-senders",
'column' : "senders",
'name' : "Senders",
'desc' : "Number of unique message senders",
'action' : "sent"
}
};
this.data_lists_file = this.data_dir + '/mls-lists.json';
this.getListsFile = function() {return this.data_lists_file;};
this.data_lists = null;
this.getListsData = function() {return this.data_lists;};
this.setListsData = function(lists, self) {
if (self === undefined) self = this;
self.data_lists = lists;
};
this.setDataDir = function(dataDir) {
this.data_dir = dataDir;
this.data_lists_file = this.data_dir + '/mls-lists.json';
MLS.prototype.setDataDir.call(this, dataDir);
};
this.getMainMetric = function() {
return "sent";
};
this.getMetrics = function() {return basic_metrics;};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
}
var html = "<h1>" + label + "</h1>";
var id_label = {
sent: "Sent",
senders: "Senders",
first_date : "Start",
last_date : "End",
repositories: "Repositories"
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
if (report === "countries")
global_data = ds.getCountriesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .mls_info').hide();
return;
}
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().mls_url;
}
if (this.global_data.type)
$(div_id + ' #mls_type').text(this.global_data.type);
if (this.global_data.url && this.global_data.url !== "." && this.global_data.type !== undefined) {
$(div_id + ' #mls_url').attr("href", url);
$(div_id + ' #mls_name').text("MLS " + this.global_data.type);
} else {
$(div_id + ' #mls_url').attr("href", Report.getProjectData().mls_url);
$(div_id + ' #mls_name').text(Report.getProjectData().mls_name);
$(div_id + ' #mls_type').text(Report.getProjectData().mls_type);
}
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #mlsFirst').text(data.first_date);
$(div_id + ' #mlsLast').text(data.last_date);
$(div_id + ' #mlsMessages').text(data.sent);
$(div_id + ' #mlsSenders').text(data.senders);
$(div_id + ' #mlsRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #mlsRepositories').hide();
};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "sent", "senders", radius);
};
// http:__lists.webkit.org_pipermail_squirrelfish-dev_
// <allura-dev.incubator.apache.org>
MLS.displayMLSListName = function (listinfo) {
var list_name_tokens = listinfo.split("_");
var list_name = '';
if (list_name_tokens.length > 1) {
list_name = list_name_tokens[list_name_tokens.length - 1];
if (list_name === "")
list_name = list_name_tokens[list_name_tokens.length - 2];
} else {
list_name = listinfo.replace("<", "");
list_name = list_name.replace(">", "");
list_name_tokens = list_name.split(".");
list_name = list_name_tokens[0];
}
return list_name;
}
function getUserLists() {
var form = document.getElementById('form_mls_selector');
var lists = [];
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].checked)
lists.push(form.elements[i].value);
}
if (localStorage) {
localStorage.setItem(getMLSId(), JSON.stringify(lists));
}
return lists;
}
this.displayBasicUserAll = function (id, all) {
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox")
form.elements[i].checked = all;
}
this.displayBasicUser(id);
};
this.displayBasicUser = function(div_id) {
$("#" + div_id).empty();
lists = getUserLists();
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
file_messages = this.getDataDir()+"/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
displayBasicList(div_id, l, file_messages);
}
};
this.displayBasic = function (div_id, config_metric) {
var lists = this.getListsData();
lists_hide = Report.getConfig().mls_hide_lists;
lists = lists.mailing_list;
if (lists === undefined) return null;
var user_pref = false;
if (typeof lists === 'string')
lists = [ lists ];
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
lists = JSON.parse(localStorage.getItem(getMLSId()));
user_pref = true;
}
}
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
if (!user_pref)
if ($.inArray(l, lists_hide) > -1)
continue;
file_messages = this.getDataDir()+ "/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
displayBasicList(div_id, l, file_messages, config_metric);
}
};
this.getTitle = function() {return "Mailing Lists";};
// TODO: use cache to store mls_file and check it!
function displayBasicList(div_id, l, mls_file, config_metric) {
var config = Viz.checkBasicConfig(config_metric);
for ( var id in basic_metrics) {
var metric = basic_metrics[id];
var title = '';
if (config.show_title)
title = metric.name;
if ($.inArray(metric.column, Report.getConfig().mls_hide) > -1)
continue;
var new_div = "<div class='info-pill m0-box-div flotr2-"
+ metric.column + "'>";
new_div += "<h1>" + metric.name + " " + MLS.displayMLSListName(l)
+ "</h1>";
new_div += "<div id='" + metric.divid + "_" + l
+ "' class='m0-box flotr2-" + metric.column + "'></div>";
if (config.show_desc)
new_div += "<p>" + metric.desc + "</p>";
new_div += "</div>";
$("#" + div_id).append(new_div);
Viz.displayBasicLinesFile(metric.divid + '_' + l, mls_file,
metric.column, config.show_labels, title);
}
}
function getReportId() {
var project_data = Report.getProjectData();
return project_data.date + "_" + project_data.project_name;
}
function getMLSId() {
return getReportId() + "_mls_lists";
}
this.displayEvoListsMain = function (id) {
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
lists = JSON.parse(localStorage.getItem(getMLSId()));
return this.displayEvoLists(id, lists);
}
}
history = this.getListsData();
lists = history.mailing_list;
if (lists === undefined) return;
var config = Report.getConfig();
lists_hide = config.mls_hide_lists;
if (typeof lists === 'string') {
lists = [ lists ];
}
var filtered_lists = [];
for ( var i = 0; i < lists.length; i++) {
if ($.inArray(lists[i], lists_hide) == -1)
filtered_lists.push(lists[i]);
}
if (localStorage) {
if (!localStorage.getItem(getMLSId())) {
localStorage.setItem(getMLSId(), JSON
.stringify(filtered_lists));
}
}
this.displayEvoLists(id, filtered_lists);
};
function cleanLocalStorage() {
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
localStorage.removeItem(getMLSId());
}
}
}
this.getDefaultLists = function () {
var default_lists = [];
var hide_lists = Report.getConfig().mls_hide_lists;
$.each(this.getListsData().mailing_list, function(index,list) {
if ($.inArray(list, hide_lists) === -1) default_lists.push(list);
});
return default_lists;
};
this.displaySelectorCheckDefault = function () {
var default_lists = this.getDefaultLists();
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox") {
var id = form.elements[i].id;
l = id.split("_check")[0];
if ($.inArray(l, default_lists) > -1)
form.elements[i].checked = true;
else form.elements[i].checked = false;
}
}
};
this.displayBasicDefault = function (div_id) {
var obj = self;
if (this instanceof MLS) obj = this;
cleanLocalStorage();
obj.displaySelectorCheckDefault();
$("#" + div_id).empty();
obj.displayBasic(div_id);
};
this.displayEvoDefault = function (div_id) {
var obj = self;
if (this instanceof MLS) obj = this;
cleanLocalStorage();
if (document.getElementById('form_mls_selector'))
obj.displaySelectorCheckDefault();
$("#" + div_id).empty();
obj.displayEvoLists(div_id, obj.getDefaultLists());
};
this.displayEvoUserAll = function (id, all) {
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox")
form.elements[i].checked = all;
}
this.displayEvoUser(id);
};
this.displayEvoUser = function (id) {
$("#" + id).empty();
var obj = self;
if (this instanceof MLS) obj = this;
obj.displayEvoLists(id, getUserLists());
};
this.displayEvoListSelector = function (div_id_sel, div_id_mls) {
this.displayEvoBasicListSelector(div_id_sel, div_id_mls, null);
};
this.displayBasicListSelector = function (div_id_sel, div_id_mls) {
this.displayEvoBasicListSelector(div_id_sel, null, div_id_mls);
};
this.displayEvoBasicListSelector = function (div_id_sel, div_id_evo, div_id_basic){
var res1 = this.getListsData();
var lists = res1.mailing_list;
var user_lists = [];
if (lists === undefined) return;
if (localStorage) {
if (localStorage.length
&& localStorage.getItem(getMLSId())) {
user_lists = JSON.parse(localStorage
.getItem(getMLSId()));
}
}
// TODO: Hack! Methods visible to HTML
Report.displayBasicUser = this.displayBasicUser;
Report.displayBasicUserAll = this.displayBasicUserAll;
Report.displayBasicDefault = this.displayBasicDefault;
Report.displayEvoDefault = this.displayEvoDefault;
Report.displayEvoUser = this.displayEvoUser;
Report.displayEvoUserAll = this.displayEvoUserAll;
var html = "Mailing list selector:";
html += "<form id='form_mls_selector'>";
if (typeof lists === 'string') {
lists = [ lists ];
}
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
html += '<input type=checkbox name="check_list" value="'
+ l + '" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUser(\''
+ div_id_evo + '\');';
if (div_id_basic)
html += 'Report.displayBasicUser(\''
+ div_id_basic + '\')";';
html += '" ';
html += 'id="' + l + '_check" ';
if ($.inArray(l, user_lists) > -1)
html += 'checked ';
html += '>';
html += MLS.displayMLSListName(l);
html += '<br>';
}
html += '<input type=button value="All" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUserAll(\'' + div_id_evo
+ '\',true);';
if (div_id_basic)
html += 'Report.displayBasicUserAll(\''
+ div_id_basic + '\',true);';
html += '">';
html += '<input type=button value="None" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUserAll(\'' + div_id_evo
+ '\',false);';
if (div_id_basic)
html += 'Report.displayBasicUserAll(\''
+ div_id_basic + '\',false);';
html += '">';
html += '<input type=button value="Default" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoDefault(\''+div_id_evo+'\');';
if (div_id_basic)
html += 'Report.displayBasicDefault(\''+div_id_basic+'\')';
html += '">';
html += "</form>";
$("#" + div_id_sel).html(html);
if (Report.getProjectsList().length>1) {
$("#" + div_id_sel).append("Not supported in multiproject");
$('#' + div_id_sel + ' :input').attr('disabled', true);
}
}
// history values should be always arrays
function filterHistory(history) {
if (typeof (history.id) === "number") {
$.each(history, function(key, value) {
value = [ value ];
});
}
return history;
}
this.displayEvoLists = function (id, lists) {
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
file_messages = this.getDataDir()+"/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
this.displayEvoList(MLS.displayMLSListName(l), id, file_messages);
}
};
this.displayEvoList = function(list_label, id, mls_file) {
var self = this;
$.getJSON(mls_file, function(history) {
// TODO: Support multiproject
self.envisionEvoList(list_label, id, history);
});
};
this.envisionEvoList = function (list_label, div_id, history) {
var config = Report.getConfig();
var options = Viz.getEnvisionOptionsMin(div_id, history,
config.mls_hide);
options.data.list_label = MLS.displayMLSListName(list_label);
new envision.templates.Envision_Report(options, [ this ]);
};
}
var aux = new MLS();
MLS.prototype = new DataSource("mls", aux.getMetrics());

997
VizGrimoireJS/src/Report.js Normal file
View File

@ -0,0 +1,997 @@
/*
* Copyright (C) 2012-2013 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Report = {};
(function() {
// Shared config
var project_data = null, markers = null, config = null,
gridster = {}, data_sources = [], html_dir="";
var data_dir = "data/json";
var default_data_dir = "data/json";
var default_html_dir = "";
var projects_dirs = [default_data_dir];
var projects_data = {};
var projects_datasources = {};
var repos_map = {};
var project_file = data_dir + "/project-info.json",
config_file = data_dir + "/viz_cfg.json",
markers_file = data_dir + "/markers.json",
repos_map_file = data_dir + "/repos-map.json";
// TODO: Why is it public? Markup API!
// Public API
Report.convertBasicDivs = convertBasicDivs;
Report.convertEnvision = convertEnvision;
Report.convertFlotr2 = convertFlotr2;
Report.convertTop = convertTop;
Report.convertBubbles = convertBubbles;
Report.convertDemographics = convertDemographics;
Report.convertSelectors = convertSelectors;
Report.createDataSources = createDataSources;
Report.getAllMetrics = getAllMetrics;
Report.getMarkers = getMarkers;
Report.getConfig = getConfig;
Report.getMetricDS = getMetricDS;
Report.getGridster = getGridster;
Report.setGridster = setGridster;
Report.getProjectData = getProjectData;
Report.getProjectsData = getProjectsData;
Report.getBasicDivs = function() {
return basic_divs;
};
Report.displayReportData = displayReportData;
Report.convertGlobal = convertGlobal;
Report.convertStudies = convertStudies;
Report.getDataSources = function() {
// return data_sources.slice(0,3);
return data_sources;
};
Report.registerDataSource = function(backend) {
data_sources.push(backend);
};
Report.setHtmlDir = function (dir) {
html_dir = dir;
};
Report.getDataDir = function() {
return data_dir;
};
Report.setDataDir = function(dataDir) {
data_dir = dataDir;
project_file = dataDir + "/project-info.json",
config_file = dataDir + "/viz_cfg.json",
markers_file = dataDir + "/markers.json";
repos_mapping_file = data_dir + "/repos-mapping.json";
};
function getMarkers() {
return markers;
}
Report.setMarkers = function (data) {
markers = data;
};
Report.getMarkersFile = function () {
return markers_file;
};
Report.getReposMap = function() {
return repos_map;
};
Report.setReposMap = function (data) {
repos_map = data;
};
Report.getReposMapFile = function () {
return repos_map_file;
};
Report.getValidRepo = function (repo, ds) {
var valid_repo = null;
var repos = ds.getReposGlobalData();
if (repos[repo]) return repo;
// Search for a mapping repository
$.each(Report.getReposMap(), function (repo_name, repo_map) {
if (repo_name === repo) {
var test_repo = repo_map;
if (repos[test_repo]!== undefined) {
valid_repo = test_repo;
return false;
}
} else if (repo_map === repo) {
var test_repo = repo_name;
if (repos[test_repo]!== undefined) {
valid_repo = test_repo;
return false;
}
}
});
return valid_repo;
};
function getConfig() {
return config;
}
Report.setConfig = function(cfg) {
config = cfg;
};
Report.getConfigFile = function() {
return config_file;
};
function getGridster() {
return gridster;
}
function setGridster(grid) {
gridster = grid;
}
function getProjectData() {
return project_data;
}
Report.setProjectData = function(data) {
project_data = data;
};
Report.getProjectFile = function () {
return project_file;
};
function getProjectsData() {
return projects_data;
}
Report.getProjectsDirs = function () {
return projects_dirs;
};
Report.setProjectsDirs = function (dirs) {
projects_dirs = dirs;
};
Report.getProjectsList = function () {
var projects_list = [];
for (key in getProjectsData()) {
projects_list.push(key);
}
return projects_list;
};
Report.getProjectsDataSources = function () {
return projects_datasources;
};
function getMetricDS(metric_id) {
var ds = [];
$.each(Report.getDataSources(), function(i, DS) {
if (DS.getMetrics()[metric_id]) {
ds.push(DS);
}
});
return ds;
}
function getAllMetrics() {
var all = {};
$.each(Report.getDataSources(), function(index, DS) {
all = $.extend({}, all, DS.getMetrics());
});
return all;
}
function displayReportData() {
data = project_data;
document.title = data.project_name + ' Report by Bitergia';
if (data.title) document.title = data.title;
$(".report_date").text(data.date);
$(".report_name").text(data.project_name);
str = data.blog_url;
if (str && str.length > 0) {
$('#blogEntry').html(
"<br><a href='" + str
+ "'>Blog post with some more details</a>");
$('.blog_url').attr("href", data.blog_url);
} else {
$('#more_info').hide();
}
str = data.producer;
if (str && str.length > 0) {
$('#producer').html(str);
} else {
$('#producer').html("<a href='http://bitergia.com'>Bitergia</a>");
}
$(".project_name").text(data.project_name);
$("#project_url").attr("href", data.project_url);
}
function checkDynamicConfig() {
var data_sources = [];
function getDataDirs(dirs_config) {
var full_params = dirs_config.split ("&");
var dirs_param = $.grep(full_params,function(item, index) {
return (item.indexOf("data_dir=") === 0);
});
for (var i=0; i< dirs_param.length; i++) {
var data_dir = dirs_param[i].split("=")[1];
data_sources.push(data_dir);
if (i === 0) Report.setDataDir(data_dir);
}
}
var querystr = window.location.search.substr(1);
// Config in GET URL
if (querystr && querystr.indexOf("data_dir")>=0) {
getDataDirs(querystr);
if (data_sources.length>0)
Report.setProjectsDirs(data_sources);
}
}
function createDataSources() {
checkDynamicConfig();
var projects_dirs = Report.getProjectsDirs();
$.each(projects_dirs, function (i, project) {
// TODO: Only DS with data should exist
var its = new ITS();
Report.registerDataSource(its);
var mls = new MLS();
Report.registerDataSource(mls);
var scm = new SCM();
Report.registerDataSource(scm);
its.setDataDir(project);
mls.setDataDir(project);
scm.setDataDir(project);
scm.setITS(its);
});
return true;
}
var basic_divs = {
"navigation": {
convert: function() {
$.get(html_dir+"navigation.html", function(navigation) {
$("#navigation").html(navigation);
var querystr = window.location.search.substr(1);
if (querystr && querystr.indexOf("data_dir")!==-1) {
var $links = $("#navigation a");
$.each($links, function(index, value){
value.href += "?"+window.location.search.substr(1);
});
}
});
}
},
"header": {
convert: function() {
$.get(html_dir+"header.html", function(header) {
$("#header").html(header);
displayReportData();
var div_companies_links = "companies_links";
if ($("#"+div_companies_links).length > 0) {
var limit = $("#"+div_companies_links).data('limit');
var order_by = $("#"+div_companies_links).data('order-by');
var DS = null;
// scm support only
$.each(data_sources, function(i, ds) {
if (ds.getName() === "scm") {DS = ds; return false;}
});
DS.displayCompaniesLinks(div_companies_links, limit, order_by);
}
var querystr = window.location.search.substr(1);
if (querystr && querystr.indexOf("data_dir")!==-1) {
var $links = $("#header a");
$.each($links, function(index, value){
value.href += "?"+window.location.search.substr(1);
});
}
});
}
},
"footer": {
convert: function() {
$.get(html_dir+"footer.html", function(footer) {
$("#footer").html(footer);
});
}
},
"activity": {
convert: function() {
var html = "<h1>Last Week</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_7";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activity").html(html);
}
},
"activitymonth": {
convert: function() {
var html = "<h1>Last Month</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_30";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activitymonth").html(html);
}
},
"activityquarter": {
convert: function() {
var html = "<h1>Last Quarter</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_90";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activityquarter").html(html);
}
},
// Reference card with info from all data sources
"refcard": {
convert: function() {
$.when($.get(html_dir+"refcard.html"),
$.get(html_dir+"project-card.html"))
.done (function(res1, res2) {
refcard = res1[0];
projcard = res2[0];
$("#refcard").html(refcard);
displayReportData();
$.each(getProjectsData(), function(prj_name, prj_data) {
var new_div = "card-"+prj_name.replace(".","").replace(" ","");
$("#refcard #projects_info").append(projcard);
$("#refcard #projects_info #new_card")
.attr("id", new_div);
$.each(data_sources, function(i, DS) {
if (DS.getProject() !== prj_name) {
$("#" + new_div + ' .'+DS.getName()+'-info').hide();
return;
}
DS.displayData(new_div);
});
$("#"+new_div+" #project_name").text(prj_name);
if (projects_dirs.length>1)
$("#"+new_div+" .project_info")
.append(' <a href="VizGrimoireJS/browser/index.html?data_dir=../../'+prj_data.dir+'">Report</a>');
$("#"+new_div+" #project_url")
.attr("href", prj_data.url);
});
});
}
},
"radar-activity": {
convert: function() {
Viz.displayRadarActivity('radar-activity');
}
},
"radar-community": {
convert: function() {
Viz.displayRadarCommunity('radar-community');
}
},
"gridster": {
convert: function() {
var gridster = $("#gridster").gridster({
widget_margins : [ 10, 10 ],
widget_base_dimensions : [ 140, 140 ]
}).data('gridster');
Report.setGridster(gridster);
gridster.add_widget("<div id='metric_selector'></div>", 1, 3);
Viz.displayGridMetricSelector('metric_selector');
Viz.displayGridMetricAll(true);
}
},
"treemap": {
convert: function() {
var file = $('#treemap').data('file');
Viz.displayTreeMap('treemap', file);
}
}
};
function convertCompanies(config) {
// General config for metrics viz
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
if (config) {
$.each(config, function(key, value) {
config_metric[key] = value;
});
}
var company = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "company")
company = querystr.split("&")[0].split("=")[1];
company = decodeURIComponent(company);
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-companies-summary";
if ($("#"+divid).length > 0) {
DS.displayCompaniesSummary(divid, this);
}
var divid = DS.getName()+"-refcard-company";
if ($("#"+divid).length > 0) {
DS.displayCompanySummary(divid, company, this);
}
var div_companies = DS.getName()+"-flotr2-companies";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var order_by = $(this).data('order-by');
var stacked = false;
if ($(this).data('stacked')) stacked = true;
config_metric.lines = {stacked : stacked};
div.id = metric+"-flotr2-companies";
DS.displayBasicMetricCompanies(metric,div.id,
config_metric, limit, order_by);
});
}
var div_companies = DS.getName()+"-flotr2-companies-static";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var order_by = $(this).data('order-by');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-companies-static";
DS.displayBasicMetricCompaniesStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_company = DS.getName()+"-flotr2-metrics-company";
var divs = $("."+div_company);
if (divs.length > 0 && company) {
$.each(divs, function(id, div) {
config_metric.show_legend = false;
var metrics = $(this).data('metrics');
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-company";
DS.displayBasicMetricsCompany(company, metrics.split(","),
div.id, config_metric);
});
}
var div_nav = DS.getName()+"-flotr2-companies-nav";
if ($("#"+div_nav).length > 0) {
var metric = $("#"+div_nav).data('sort-metric');
DS.displayCompaniesNav(div_nav, metric);
}
var divs_comp_list = DS.getName()+"-flotr2-companies-list";
var divs = $("."+divs_comp_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var sort_metric = $(this).data('sort-metric');
div.id = metrics.replace(/,/g,"-")+"-flotr2-companies-list";
DS.displayCompaniesList(metrics.split(","),div.id,
config_metric, sort_metric);
});
}
var div_companies = DS.getName()+"-flotr2-top-company";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var period = $(this).data('period');
var titles = $(this).data('titles');
div.id = metric+"-"+period+"-flotr2-top-company";
div.className = "";
DS.displayTopCompany(company,div.id,metric,period,titles);
});
}
});
}
function convertCountries() {
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
var country = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "country")
country = decodeURIComponent(querystr.split("&")[0].split("=")[1]);
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-countries-summary";
if ($("#"+divid).length > 0) {
DS.displayCountriesSummary(divid, this);
}
var div_countries = DS.getName()+"-flotr2-countries-static";
var divs = $("."+div_countries);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
var order_by = $(this).data('order-by');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-countries-static";
DS.displayBasicMetricCountriesStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_nav = DS.getName()+"-flotr2-countries-nav";
if ($("#"+div_nav).length > 0) {
var order_by = $("#"+div_nav).data('order-by');
DS.displayCountriesNav(div_nav, order_by);
}
var divs_countries_list = DS.getName()+"-flotr2-countries-list";
var divs = $("."+divs_countries_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var order_by = $(this).data('order-by');
div.id = metrics.replace(/,/g,"-")+"-flotr2-countries-list";
DS.displayCountriesList(metrics.split(","),div.id,
config_metric, order_by);
});
}
if (country !== null) {
var divid = DS.getName()+"-refcard-country";
if ($("#"+divid).length > 0) {
DS.displayCountrySummary(divid, country, this);
}
var div_country = DS.getName()+"-flotr2-metrics-country";
var divs = $("."+div_country);
if (divs.length) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-country";
DS.displayBasicMetricsCountry(country, metrics.split(","),
div.id, config_metric);
});
}
}
});
}
function convertRepos() {
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
var repo = null, repo_valid = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "repository") {
repo = decodeURIComponent(querystr.split("&")[0].split("=")[1]);
}
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-repos-summary";
if ($("#"+divid).length > 0) {
DS.displayReposSummary(divid, this);
}
var div_repos = DS.getName()+"-flotr2-repos-static";
var divs = $("."+div_repos);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
var order_by = $(this).data('order-by');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-repos-static";
DS.displayBasicMetricReposStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_nav = DS.getName()+"-flotr2-repos-nav";
if ($("#"+div_nav).length > 0) {
var order_by = $("#"+div_nav).data('order-by');
var scm_and_its = $("#"+div_nav).data('scm-and-its');
DS.displayReposNav(div_nav, order_by, scm_and_its);
}
var divs_repos_list = DS.getName()+"-flotr2-repos-list";
var divs = $("."+divs_repos_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var order_by = $(this).data('order-by');
var scm_and_its = $(this).data('scm-and-its');
div.id = metrics.replace(/,/g,"-")+"-flotr2-repos-list";
DS.displayReposList(metrics.split(","),div.id,
config_metric, order_by, scm_and_its);
});
}
if (repo !== null) repo_valid = Report.getValidRepo(repo, DS);
if (repo_valid !== null) {
var divid = DS.getName()+"-refcard-repo";
if ($("#"+divid).length > 0) {
DS.displayRepoSummary(divid, repo_valid, this);
}
var div_repo = DS.getName()+"-flotr2-metrics-repo";
var divs = $("."+div_repo);
if (divs.length) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-repo";
DS.displayBasicMetricsRepo(repo_valid, metrics.split(","),
div.id, config_metric);
});
}
}
});
}
function convertFlotr2(config) {
// General config for metrics viz
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
if (config) {
$.each(config, function(key, value) {
config_metric[key] = value;
});
}
var already_shown = [];
var metric_already_shown = [];
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
$.each(DS.getMetrics(), function(i, metric) {
var div_flotr2 = metric.divid+"-flotr2";
if ($("#"+div_flotr2).length > 0 &&
$.inArray(metric.column, metric_already_shown) === -1) {
DS.displayBasicMetricHTML(i,div_flotr2, config_metric);
metric_already_shown.push(metric.column);
}
// Getting data real time
var div_flotr2_rt = metric.divid+"-flotr2-rt";
var divs = $("."+div_flotr2_rt);
if (divs.length > 0) {
$.each(divs, function(id, div) {
config_metric.realtime = true;
// config_metric.json_ds = "http://localhost:1337/?callback=?";
var db = "acs_cvsanaly_allura_1049";
db = $(this).data('db');
div.id = db + "_" + div.className;
config_metric.json_ds ="http://localhost:3000/scm/"+db+"/";
config_metric.json_ds += metric.column+"_evol/?callback=?";
DS.displayBasicMetricHTML(i,div.id, config_metric);
});
}
});
if ($("#"+DS.getName()+"-flotr2").length > 0) {
if ($.inArray(DS.getName(), already_shown) === -1) {
DS.displayBasicHTML(DS.getName()+'-flotr2', config_metric);
already_shown.push(DS.getName());
}
}
if (DS instanceof MLS) {
if ($("#"+DS.getName()+"-flotr2"+"-lists").length > 0) {
if (Report.getProjectsList().length === 1)
DS.displayBasic
(DS.getName() + "-flotr2"+"-lists", config_metric);
}
}
// Multiparam
var div_param = DS.getName()+"-flotr2-metrics";
var divs = $("."+div_param);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend'))
config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics";
DS.displayBasicMetrics(metrics.split(","),div.id,
config_metric);
});
}
// Time to fix
var div_ttfix = DS.getName()+"-time-to-fix";
divs = $("."+div_ttfix);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var quantil = 'X'+$(this).data('quantil');
div.id = DS.getName()+"-time-to-fix-"+quantil;
DS.displayTimeToFix(div.id, quantil);
});
}
// Time to attention
var div_ttatt = DS.getName()+"-time-to-attention";
divs = $("."+div_ttatt);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var quantil = 'X'+$(this).data('quantil');
div.id = DS.getName()+"-time-to-attention-"+quantil;
DS.displayTimeToAttention(div.id, quantil);
});
}
});
}
function convertEnvision() {
if ($("#all-envision").length > 0) {
var relative = $('#all-envision').data('relative');
Viz.displayEvoSummary('all-envision', relative);
}
var already_shown = [];
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_envision = DS.getName() + "-envision";
if ($("#" + div_envision).length > 0) {
if ($.inArray(DS.getName(), already_shown) !== -1)
return;
var relative = $('#'+div_envision).data('relative');
if (DS instanceof MLS) {
DS.displayEvo(div_envision, relative);
// DS.displayEvoAggregated(div_envision);
if (Report.getProjectsList().length === 1)
if ($("#" + DS.getName() + "-envision"+"-lists").length > 0)
DS.displayEvoListsMain
(DS.getName() + "-envision"+"-lists");
} else if ($.inArray(DS.getName(), already_shown) === -1) {
DS.displayEvo(div_envision, relative);
}
already_shown.push(DS.getName());
}
});
}
function convertIdentity() {
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-people";
if ($("#"+divid).length > 0) {
Identity.showList(divid, DS);
}
});
if ($("#unique-people").length > 0)
Identity.showListNested("unique-people");
}
function convertTop() {
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_id_top = DS.getName()+"-top";
var show_all = false;
if ($("#"+div_id_top).length > 0) {
if ($("#"+div_id_top).data('show_all')) show_all = true;
var top_metric = $("#"+div_id_top).data('metric');
DS.displayTop(div_id_top, show_all, top_metric);
}
$.each(['pie','bars'], function (index, chart) {
var div_id_top = DS.getName()+"-top-"+chart;
if ($("#"+div_id_top).length > 0) {
if ($("#"+div_id_top).data('show_all')) show_all = true;
var show_metric = $("#"+div_id_top).data('metric');
DS.displayTop(div_id_top, show_all, show_metric, chart);
}
div_id_top = DS.getName()+"-top-basic-"+chart;
if ($("#"+div_id_top).length > 0) {
var doer = $("#"+div_id_top).data('doer');
var action = $("#"+div_id_top).data('action');
DS.displayTopBasic(div_id_top, action, doer, chart);
}
});
var div_tops = DS.getName()+"-global-top-metric";
var divs = $("."+div_tops);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var period = $(this).data('period');
var titles = $(this).data('titles');
div.id = metric.replace("_","-")+"-"+period+"-global-metric";
DS.displayTopGlobal(div.id, metric, period, titles);
});
}
});
}
function convertBubbles() {
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_time = DS.getName() + "-time-bubbles";
if ($("#" + div_time).length > 0) {
var radius = $("#" + div_time).data('radius');
DS.displayBubbles(div_time, radius);
}
});
}
function convertDemographics() {
$.each(Report.getDataSources(), function(index, DS) {
var div_demog = DS.getName() + "-demographics";
if ($("#" + div_demog).length > 0)
DS.displayDemographics(div_demog);
// Specific demographics loaded from files
var divs = $('[id^="' + DS.getName() + '-demographics"]');
for ( var i = 0; i < divs.length; i++) {
var file = $(divs[i]).data('file');
// period in years
var period = $(divs[i]).data('period');
DS.displayDemographics(divs[i].id, file, period);
}
});
}
function convertSelectors() {
// Selectors
$.each(Report.getDataSources(), function(index, DS) {
var div_selector = DS.getName() + "-selector";
var div_envision = DS.getName() + "-envision-lists";
var div_flotr2 = DS.getName() + "-flotr2-lists";
if ($("#" + div_selector).length > 0)
// TODO: Only MLS supported
if (DS instanceof MLS) {
DS.displayEvoBasicListSelector(div_selector, div_envision,
div_flotr2);
}
});
}
function convertBasicDivs() {
$.each (basic_divs, function(divid, value) {
if ($("#"+divid).length > 0) value.convert();
});
}
function configDataSources() {
var prjs_dss = Report.getProjectsDataSources();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getData() instanceof Array) return;
$.each(projects_data, function (name, project) {
if (project.dir === ds.getDataDir()) {
if (prjs_dss[name] === undefined) prjs_dss[name] = [];
ds.setProject(name);
prjs_dss[name].push(ds);
return false;
}
});
});
}
Report.setReportConfig = function (data) {
if (data) {
if (data['global-html-dir'])
Report.setHtmlDir(data['global-html-dir']);
if (data['global-data-dir'])
Report.setDataDir(data['global-data-dir']);
if (data['projects-data-dirs'])
Report.setProjectsDirs(data['projects-data-dirs']);
}
};
function convertGlobal() {
configDataSources();
convertBasicDivs();
convertBubbles();
convertEnvision();
convertFlotr2(config);
convertTop();
}
function convertStudies() {
convertRepos();
convertCompanies();
convertCountries();
convertDemographics();
convertSelectors();
}
// TODO: Move to plugins
function convertOthers() {
// TODO: Create a new class for Identity?
convertIdentity();
}
})();
Loader.data_ready_global(function() {
Report.convertGlobal();
});
Loader.data_ready(function() {
Report.convertStudies();
$("body").css("cursor", "auto");
});
$(document).ready(function() {
$.getJSON('config.json', function(data) {
Report.setReportConfig(data);
}).always(function (data) {
Report.createDataSources();
Loader.data_load();
$("body").css("cursor", "progress");
});
});

234
VizGrimoireJS/src/SCM.js Normal file
View File

@ -0,0 +1,234 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function SCM() {
var basic_metrics = {
'commits' : {
'divid' : "scm-commits",
'column' : "commits",
'name' : "Commits",
'desc' : "Evolution of the number of commits (aggregating branches)",
'envision' : {
y_labels : true,
show_markers : true
}
},
'committers' : {
'divid' : "scm-committers",
'column' : "committers",
'name' : "Committers",
'desc' : "Unique committers making changes to the source code",
'action' : "commits",
'envision' : {
gtype : 'whiskers'
}
},
'authors' : {
'divid' : "scm-authors",
'column' : "authors",
'name' : "Authors",
'desc' : "Unique authors making changes to the source code",
'action' : "commits",
'envision' : {
gtype : 'whiskers'
}
},
'authors_rev' : {
'divid' : "scm-authors-rev",
'column' : "authors_rev",
'name' : "Authors",
'desc' : "Unique authors making changes reviewed to the source code",
'action' : "commits_rev",
'envision' : {
gtype : 'whiskers'
}
},
'commits_rev' : {
'divid' : "scm-commits-rev",
'column' : "commits_rev",
'name' : "Commits Reviewed",
'desc' : "Evolution of the number of commits reviewed (aggregating branches)",
'envision' : {
y_labels : true,
show_markers : true
}
},
'reviewers' : {
'divid' : "scm-reviewers",
'column' : "reviewers",
'name' : "Reviewers",
'desc' : "Unique reviewers making reviews to the source code changes",
'action' : "commits-rev",
'envision' : {
gtype : 'whiskers'
}
},
'branches' : {
'divid' : "scm-branches",
'column' : "branches",
'name' : "Branches",
'desc' : "Evolution of the number of branches"
},
'files' : {
'divid' : "scm-files",
'column' : "files",
'name' : "Files",
'desc' : "Evolution of the number of unique files handled by the community"
},
'files' : {
'divid' : "scm-files",
'column' : "files",
'name' : "Files",
'desc' : "Evolution of the number of unique files handled by the community"
},
'added_lines' : {
'divid' : "scm-added-lines",
'column' : "added_lines",
'name' : "Lines Added",
'desc' : "Evolution of the source code lines added"
},
'removed_lines' : {
'divid' : "scm-removed-lines-",
'column' : "removed_lines",
'name' : "Lines Removed",
'desc' : "Evolution of the source code lines removed"
},
'repositories' : {
'divid' : "scm-repositories",
'column' : "repositories",
'name' : "Repositories",
'desc' : "Evolution of the number of repositories",
'envision' : {
gtype : 'whiskers'
}
}
};
this.getMetrics = function() {return basic_metrics;};
this.getMainMetric = function() {
return "commits";
};
this.setITS = function(its) {
this.its = its;
};
this.getITS = function(its) {
return this.its;
};
this.getTitle = function() {return "Change sets (commits to source code)";};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
}
var html = "<h1>"+label+"</h1>";
var id_label = {
commits:'Commits',
committers:'Committers',
authors:'Authors',
first_date:'Start',
last_date:'End',
files:'Files',
actions:'Files actions',
avg_commits_month:'Commits/month',
avg_files_month:'Files/month',
avg_authors_month:'Authors/month',
avg_reviewers_month:'Reviewers/moth',
avg_commits_week:'Commits/week',
avg_files_week:'Files/week',
avg_authors_week:'Authors/week',
avg_reviewers_week:'Reviewers/week',
avg_commits_author:'Commits/author',
avg_files_author:'Files/author'
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else if (report === "countries")
global_data = ds.getCountriesGlobalData();
else return;
if (!global_data[item]) return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .scm-info').hide();
return;
}
$(div_id + ' #scm_type').text(this.global_data.type);
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().scm_url;
}
if (this.global_data.type === "git")
if (url) url = url.replace("git://","http://");
$(div_id + ' #scm_url').attr("href", url);
$(div_id + ' #scm_name').text(this.global_data.type);
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #scmFirst').text(data.first_date);
$(div_id + ' #scmLast').text(data.last_date);
$(div_id + ' #scmCommits').text(data.commits);
$(div_id + ' #scmAuthors').text(data.authors);
if (data.reviewers)
$(div_id + ' #scmReviewers').text(data.reviewers);
$(div_id + ' #scmCommitters').text(data.committers);
$(div_id + ' #scmRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #scmRepositories').hide();
};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "commits", "committers", radius);
};
}
var aux = new SCM();
SCM.prototype = new DataSource("scm", aux.getMetrics());

1394
VizGrimoireJS/src/Viz.js Normal file

File diff suppressed because it is too large Load Diff

3
VizGrimoireJS/src/d3-treemap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
VizGrimoireJS/src/envision.min.css vendored Normal file
View File

@ -0,0 +1 @@
.flotr-handles-handle{background:#eee;border:1px solid #333;position:absolute;cursor:pointer;border-radius:3px}.flotr-handles-handle,.flotr-grid-label{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.flotr-handles-drag{height:12px;width:6px}.flotr-handles-scroll{height:6px;cursor:move}.flotr-handles-left{cursor:w-resize}.flotr-handles-right{cursor:e-resize}.envision-finance{width:600px}.envision-finance-price .envision-component{height:200px}.envision-finance-volume .envision-component{height:60px}.envision-finance-connection .envision-component{height:16px}.envision-finance-summary .envision-component{cursor:all-scroll;height:70px;margin-top:-2px}.envision-finance-price,.envision-finance-volume{border:1px solid #B6D9FF;background:#fff}.envision-finance-price{border-top-right-radius:5px;border-top-left-radius:5px}.envision-finance-volume{border-top:0}.envision-finance-connection canvas{z-index:10;background:#fff}.envision-finance-connection canvas object{position:absolute;top:0}.envision-finance-price .flotr-grid-label{margin-left:4px}.envision-finance-price .flotr-grid-label.first{margin-top:-6px}.envision-finance-price .flotr-grid-label.last{margin-top:6px}.envision-finance-summary .flotr-grid-label{margin-top:3px}.envision-finance-price .flotr-mouse-value{font-size:12px}.envision-finance-volume .flotr-mouse-value{display:none}@media screen and (max-width:600px){.envision-finance{width:100%}.envision-finance-price .envision-component{height:120px}.envision-finance-summary .envision-component,.envision-finance-volume .envision-component{height:40px}}.envision-timeseries{width:auto}.envision-timeseries-detail .envision-component{height:200px}.envision-timeseries-connection .envision-component{height:16px}.envision-timeseries-summary .envision-component{cursor:all-scroll;height:80px}.envision-timeseries-detail{padding-top:7px;border:1px solid #B6D9FF;border-top-right-radius:5px;border-top-left-radius:5px;border-bottom:0;background:#e2f0ff}.envision-timeseries-connection canvas{z-index:10;background:#fff}.envision-timeseries-connection canvas object{position:absolute;top:0}.envision-timeseries-summary .envision-component{margin-top:-2px}

4
VizGrimoireJS/src/jquery-1.7.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
/*! gridster.js - v0.1.0 - 2012-10-20
* http://gridster.net/
* Copyright (c) 2012 ducksboard; Licensed MIT */
.gridster {
position:relative;
}
.gridster > * {
margin: 0 auto;
-webkit-transition: height .4s;
-moz-transition: height .4s;
-o-transition: height .4s;
-ms-transition: height .4s;
transition: height .4s;
}
.gridster .gs_w{
z-index: 2;
position: absolute;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s;
-moz-transition: opacity .3s, left .3s, top .3s;
-o-transition: opacity .3s, left .3s, top .3s;
transition: opacity .3s, left .3s, top .3s;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-moz-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-o-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
}
.gridster .preview-holder {
z-index: 1;
position: absolute;
background-color: #fff;
border-color: #fff;
opacity: 0.3;
}
.gridster .player-revert {
z-index: 10!important;
-webkit-transition: left .3s, top .3s!important;
-moz-transition: left .3s, top .3s!important;
-o-transition: left .3s, top .3s!important;
transition: left .3s, top .3s!important;
}
.gridster .dragging {
z-index: 10!important;
-webkit-transition: all 0s !important;
-moz-transition: all 0s !important;
-o-transition: all 0s !important;
transition: all 0s !important;
}
/* Uncomment this if you set helper : "clone" in draggable options */
/*.gridster .player {
opacity:0;
}*/

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,74 @@
/* Shared CSS Style in all Envision Bitergia Reports */
.envision-component-container {
width: 325px;
height : 50px;
}
.envision-component-container.envision-first {
width: 325px;
height : 200px;
}
.envision-component {
width: 100%;
height: 100%;
}
.report-connection.envision-component-container {
height: 20px;
}
.report-summary.envision-component-container {
cursor: all-scroll;
height : 50px;
margin-top: -2px;
}
/* .milestone0-scm-committers {
border-top: 0px;
}
*/
/* Connection overlay */
.milestone0-connection .canvas {
z-index: 10;
background: #fff;
}
.milestone0-connection .canvas .object {
position: absolute;
top: 0px;
}
/* X-Axis Labels */
.milestone0-summary .flotr-grid-label {
margin-top: 5px;
}
/* Mouse Tracker */
.envision-component-container.envision-first .flotr-mouse-value {
font-size: 12px;
display:inline;
}
.envision-component-container .flotr-mouse-value
{
display: none;
}
/* @media screen and (max-width: 600px) {
.milestone0-scm-commits {
width: 100%;
}
.milestone0-scm-commits .envision-component
{
height: 120px;
}
.milestone0-scm-summary .envision-component,
.milestone0-scm-committers .envision-component {
height: 40px;
}
} */

View File

@ -0,0 +1,272 @@
/* Auto resize the image to fit with no scrolls */
img {
max-width: 100%;
height: auto;
width: auto\9; /* ie8 */
}
body {
margin: 0;
padding: 0;
/* background: #FFA500; */
font: normal 0.75em georgia, sans-serif;
}
/*
LAYOUT: We need to simplify it
*/
#wrapper {
margin: 0% 2%;
width: 95%;
float: center;
}
#header {
overflow: auto;
position: relative;
margin: 5px 0 0 0;
}
.ie6 #header {
width: 100%;
}
.column-right {
width: 450px;
margin: 8px auto;
float: right;
}
.left {
float: left;
}
.column {
margin-left: 8px;
margin-right: 8px;
}
#info-column1{
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column2{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column3{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column4{
float: left;
width: 325px;
margin-bottom: 40px;
}
.info-pill {
-moz-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-webkit-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
#footer {
overflow: hidden;
clear: both;
padding: 10px 0;
border-top: 1px dashed #000;
}
#companies-column1 {
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 40px;
}
#companies-column2 {
float: right;
width: 650px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column1 {
float: left;
width: 150px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column2 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column3 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
/*
FOOTER COMPONENTS
*/
#footer p, #footer dl {
margin: 0;
font-size: 88%;
line-height: 1.2;
}
/*
TEXT
*/
h1 {
margin-bottom: .25em;
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 100%;
/* text-shadow: -1px -1px 1px hsla(0,0%,100%,.6);
letter-spacing: -1px; */
color: #ffa500;
}
h1, h2, h3 {
font-weight: bold;
line-height: 1.2;
}
h2, h3 {
margin-bottom: 0;
color: #555;
}
h2 {
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 115%;
/* text-shadow: -1px -1px 0 hsla(0,0%,100%,.6);
letter-spacing: -1px; */
}
h3 {
font-family: Cambria, "Palatino Linotype", "Book Antiqua", Palatino, serif;
font-size: 105%;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Boxes for flotr2 */
.m0-box-div {
height: 130px;
}
.m0-box {
width: 180px;
height: 100px;
float: right;
margin-right: 5px;
margin-left: 5px;
}
/* Specific layout for some vizs */
/*
MLS
*/
.mls-dyn-list {
float: left;
margin-left: 8px;
margin-right: 8px;
width: 380px;
}
#mls-envision .envision-component-container.envision-first {
width: 500px;
}
#mls-envision .envision-component-container {
width: 500px;
}
#mls-envision-lists .envision-component-container.envision-first {
width: 325px;
height : 150px;
}
#mls-envision-lists .report-summary .envision-component {
cursor: all-scroll;
height : 30px;
margin-top: -2px;
/* align envision and flotr2 graphs*/
margin-bottom: 200px;
}
/*
OTHER STYLES FOR SPECIFIC CHARTS
*/
.graph .flotr-grid-label {
font-size: 0.6em
}
.graph {
height:200px;
width:200px;
}
.bubbles {
height:300px;
width:600px;
}
.radar {
height:400px;
width:500px;
}
.demographics {
height:400px;
width:400px;
}
.treemap {
position: relative;
width: 700px;
height: 500px;
}
.treemap-node {
border: solid 1px white;
font: 10px sans-serif;
line-height: 12px;
overflow: hidden;
position: absolute;
text-indent: 2px;
}
.basic-metric-html {height:100px;}
.subreport-list {height:120px;}
.subreport-list-item {float:right;height:100px;width:40%;}

1
VizGrimoireJS/update.sh Normal file
View File

@ -0,0 +1 @@
rsync --existing -avP ../VizGrimoireJS.link/* .

View File

@ -0,0 +1,409 @@
.flotr-handles-handle{background:#eee;border:1px solid #333;position:absolute;cursor:pointer;border-radius:3px}.flotr-handles-handle,.flotr-grid-label{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.flotr-handles-drag{height:12px;width:6px}.flotr-handles-scroll{height:6px;cursor:move}.flotr-handles-left{cursor:w-resize}.flotr-handles-right{cursor:e-resize}.envision-finance{width:600px}.envision-finance-price .envision-component{height:200px}.envision-finance-volume .envision-component{height:60px}.envision-finance-connection .envision-component{height:16px}.envision-finance-summary .envision-component{cursor:all-scroll;height:70px;margin-top:-2px}.envision-finance-price,.envision-finance-volume{border:1px solid #B6D9FF;background:#fff}.envision-finance-price{border-top-right-radius:5px;border-top-left-radius:5px}.envision-finance-volume{border-top:0}.envision-finance-connection canvas{z-index:10;background:#fff}.envision-finance-connection canvas object{position:absolute;top:0}.envision-finance-price .flotr-grid-label{margin-left:4px}.envision-finance-price .flotr-grid-label.first{margin-top:-6px}.envision-finance-price .flotr-grid-label.last{margin-top:6px}.envision-finance-summary .flotr-grid-label{margin-top:3px}.envision-finance-price .flotr-mouse-value{font-size:12px}.envision-finance-volume .flotr-mouse-value{display:none}@media screen and (max-width:600px){.envision-finance{width:100%}.envision-finance-price .envision-component{height:120px}.envision-finance-summary .envision-component,.envision-finance-volume .envision-component{height:40px}}.envision-timeseries{width:auto}.envision-timeseries-detail .envision-component{height:200px}.envision-timeseries-connection .envision-component{height:16px}.envision-timeseries-summary .envision-component{cursor:all-scroll;height:80px}.envision-timeseries-detail{padding-top:7px;border:1px solid #B6D9FF;border-top-right-radius:5px;border-top-left-radius:5px;border-bottom:0;background:#e2f0ff}.envision-timeseries-connection canvas{z-index:10;background:#fff}.envision-timeseries-connection canvas object{position:absolute;top:0}.envision-timeseries-summary .envision-component{margin-top:-2px}/*! gridster.js - v0.1.0 - 2012-10-20
* http://gridster.net/
* Copyright (c) 2012 ducksboard; Licensed MIT */
.gridster {
position:relative;
}
.gridster > * {
margin: 0 auto;
-webkit-transition: height .4s;
-moz-transition: height .4s;
-o-transition: height .4s;
-ms-transition: height .4s;
transition: height .4s;
}
.gridster .gs_w{
z-index: 2;
position: absolute;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s;
-moz-transition: opacity .3s, left .3s, top .3s;
-o-transition: opacity .3s, left .3s, top .3s;
transition: opacity .3s, left .3s, top .3s;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-moz-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-o-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
}
.gridster .preview-holder {
z-index: 1;
position: absolute;
background-color: #fff;
border-color: #fff;
opacity: 0.3;
}
.gridster .player-revert {
z-index: 10!important;
-webkit-transition: left .3s, top .3s!important;
-moz-transition: left .3s, top .3s!important;
-o-transition: left .3s, top .3s!important;
transition: left .3s, top .3s!important;
}
.gridster .dragging {
z-index: 10!important;
-webkit-transition: all 0s !important;
-moz-transition: all 0s !important;
-o-transition: all 0s !important;
transition: all 0s !important;
}
/* Uncomment this if you set helper : "clone" in draggable options */
/*.gridster .player {
opacity:0;
}*/
/* Auto resize the image to fit with no scrolls */
img {
max-width: 100%;
height: auto;
width: auto\9; /* ie8 */
}
body {
margin: 0;
padding: 0;
/* background: #FFA500; */
font: normal 0.75em georgia, sans-serif;
}
/*
LAYOUT: We need to simplify it
*/
#wrapper {
margin: 0% 2%;
width: 95%;
float: center;
}
#header {
overflow: auto;
position: relative;
margin: 5px 0 0 0;
}
.ie6 #header {
width: 100%;
}
.column-right {
width: 450px;
margin: 8px auto;
float: right;
}
.left {
float: left;
}
.column {
margin-left: 8px;
margin-right: 8px;
}
#info-column1{
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column2{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column3{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column4{
float: left;
width: 325px;
margin-bottom: 40px;
}
.info-pill {
-moz-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-webkit-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
#footer {
overflow: hidden;
clear: both;
padding: 10px 0;
border-top: 1px dashed #000;
}
#companies-column1 {
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 40px;
}
#companies-column2 {
float: right;
width: 650px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column1 {
float: left;
width: 150px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column2 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column3 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
/*
FOOTER COMPONENTS
*/
#footer p, #footer dl {
margin: 0;
font-size: 88%;
line-height: 1.2;
}
/*
TEXT
*/
h1 {
margin-bottom: .25em;
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 100%;
/* text-shadow: -1px -1px 1px hsla(0,0%,100%,.6);
letter-spacing: -1px; */
color: #ffa500;
}
h1, h2, h3 {
font-weight: bold;
line-height: 1.2;
}
h2, h3 {
margin-bottom: 0;
color: #555;
}
h2 {
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 115%;
/* text-shadow: -1px -1px 0 hsla(0,0%,100%,.6);
letter-spacing: -1px; */
}
h3 {
font-family: Cambria, "Palatino Linotype", "Book Antiqua", Palatino, serif;
font-size: 105%;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Boxes for flotr2 */
.m0-box-div {
height: 130px;
}
.m0-box {
width: 180px;
height: 100px;
float: right;
margin-right: 5px;
margin-left: 5px;
}
/* Specific layout for some vizs */
/*
MLS
*/
.mls-dyn-list {
float: left;
margin-left: 8px;
margin-right: 8px;
width: 380px;
}
#mls-envision .envision-component-container.envision-first {
width: 500px;
}
#mls-envision .envision-component-container {
width: 500px;
}
#mls-envision-lists .envision-component-container.envision-first {
width: 325px;
height : 150px;
}
#mls-envision-lists .report-summary .envision-component {
cursor: all-scroll;
height : 30px;
margin-top: -2px;
/* align envision and flotr2 graphs*/
margin-bottom: 200px;
}
/*
OTHER STYLES FOR SPECIFIC CHARTS
*/
.graph .flotr-grid-label {
font-size: 0.6em
}
.graph {
height:200px;
width:200px;
}
.bubbles {
height:300px;
width:600px;
}
.radar {
height:400px;
width:500px;
}
.demographics {
height:400px;
width:400px;
}
.treemap {
position: relative;
width: 700px;
height: 500px;
}
.treemap-node {
border: solid 1px white;
font: 10px sans-serif;
line-height: 12px;
overflow: hidden;
position: absolute;
text-indent: 2px;
}
.basic-metric-html {height:100px;}
.subreport-list {height:120px;}
.subreport-list-item {float:right;height:100px;width:40%;}/* Shared CSS Style in all Envision Bitergia Reports */
.envision-component-container {
width: 325px;
height : 50px;
}
.envision-component-container.envision-first {
width: 325px;
height : 200px;
}
.envision-component {
width: 100%;
height: 100%;
}
.report-connection.envision-component-container {
height: 20px;
}
.report-summary.envision-component-container {
cursor: all-scroll;
height : 50px;
margin-top: -2px;
}
/* .milestone0-scm-committers {
border-top: 0px;
}
*/
/* Connection overlay */
.milestone0-connection .canvas {
z-index: 10;
background: #fff;
}
.milestone0-connection .canvas .object {
position: absolute;
top: 0px;
}
/* X-Axis Labels */
.milestone0-summary .flotr-grid-label {
margin-top: 5px;
}
/* Mouse Tracker */
.envision-component-container.envision-first .flotr-mouse-value {
font-size: 12px;
display:inline;
}
.envision-component-container .flotr-mouse-value
{
display: none;
}
/* @media screen and (max-width: 600px) {
.milestone0-scm-commits {
width: 100%;
}
.milestone0-scm-commits .envision-component
{
height: 120px;
}
.milestone0-scm-summary .envision-component,
.milestone0-scm-committers .envision-component {
height: 40px;
}
} */

16881
VizGrimoireJS/vizgrimoire.js Normal file

File diff suppressed because one or more lines are too long

12
VizGrimoireJS/vizgrimoire.min.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
bitergia-logo-small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
bitergia-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
cc-by-sa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

84
companies.html Normal file
View File

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html>
<head>
<meta name="keywords" content="bitergia, floss, libresoft, oss, linux, research, reports, free software, software analysis, liferay" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, maximum-scale=1.0">
<meta name="description" content="Bitergia company website" />
<link rel="stylesheet" type="text/css" id="theme" href="VizGrimoireJS/vizgrimoire.css" />
<script type="text/javascript" src="VizGrimoireJS/src/jquery-1.7.1.min.js"></script>
<title>WebKit Report by Bitergia: Information about all companies</title>
<style type="text/css">
</style>
</head>
<body>
<div id="wrapper">
<div id="header"></div>
<div id="navigation"></div>
<div style="float:left">
<div style="float:left">
<div id="info-pill">
<h1 style="font-size:1.5em;font-weight: bold;">Information about all companies</h1>
<p>Some charts and tables for all companies in the project, and a summary of the evolution of their participation with links to more detailed information per company.</p>
</div>
<div>
<div id="info-pill" style="width:360px;height:170px;float:left;margin-bottom:15px;margin-righ:15px">
<div style="float:left;width:350px;height:150px"
class="scm-flotr2-metrics" data-metrics="num_companies" data-legend="false"></div>
<i><b>Active companies per month</b></i><a href="notes.html#note:charts:companies:companies"><img src="qm_15.png"></a>
</div>
<div class="info-pill" style="width:360px;height:170px;float:left;margin-bottom:15px;">
<div style="float:left;margin:10px;width:350px;height:150px" id="scm-companies-summary">
</div>
</div>
</div>
<div>
<div id="info-pill" style="width:370px;height:270px;float:left;margin-bottom:25px;margin-righ:25px">
<div class="scm-flotr2-companies-static"
data-metric="commits" data-limit="10"
style="width:350px;height:250px;margin-right:10px;float:left;margin-bottom:10px"></div>
<i><b>Commits per company (aggregated)</b><a href="notes.html#note:charts:companies:commits_agg"><img src="qm_15.png"></a></i>
</div>
<div id="info-pill" style="width:370px;height:270px;float:left;margin-bottom:25px;margin-righ:25px">
<div class="scm-flotr2-companies-static"
data-metric="authors" data-limit="10" data-order-by="commits"
style="width:350px;height:250px;margin-right:10px;float:left;margin-bottom:10px"></div>
<i><b>Authors per company (aggregated)</b><a href="notes.html#note:charts:companies:authors_agg"><img src="qm_15.png"></a></i>
</div>
</div>
</div>
<!-- Companies Navigation -->
<div style="width=715px;padding:20px;">
<h1 style="font-weight: bold;">List of companies</h1>
<div id="scm-flotr2-companies-nav" data-sort-metric="commits_rev"
style="width:700px;"></div>
</div>
<!-- Companies flotr2 list -->
<div>
<div class="scm-flotr2-companies-list"
data-metrics="commits,authors" data-sort-metric="commits"
style="width:700px; margin-right:10px;"></div>
</div>
</div>
<div id="footer"></div>
</div>
<!-- <script type="text/javascript" src="VizGrimoireJS/vizgrimoire.min.js"></script> -->
<script type="text/javascript" src="VizGrimoireJS/src/envision.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/DataSource.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Loader.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Report.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/ITS.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/MLS.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/SCM.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Envision_Report.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Viz.js"></script>
</body>
</html>

90
company.html Normal file
View File

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html>
<head>
<meta name="keywords" content="bitergia, floss, libresoft, oss, linux, research, reports, free software, software analysis" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, maximum-scale=1.0">
<meta name="description" content="Bitergia company website" />
<link rel="stylesheet" type="text/css" id="theme" href="VizGrimoireJS/vizgrimoire.css" />
<script type="text/javascript" src="VizGrimoireJS/src/jquery-1.7.1.min.js"></script>
<title>Report by Bitergia: Company information</title>
<style type="text/css">
</style>
</head>
<body>
<div id="wrapper">
<div id="header"></div>
<div id="info-column1" style="width:200px">
<div id="navigation"></div>
<div class="info-pill">
<div id="scm-refcard-company"></div>
</div>
</div>
<div style="float:left">
<div style="float:left">
<div style="margin-bottom:15px;">
<div class="scm-flotr2-metrics-company"
style="width:350px;height:250px;margin-bottom:5px;"
data-metrics="commits" data-legend="false"></div>
<i><b>Reviewed commits per month</b></i>
<a href="notes.html#note:charts:company:commits"><img src="qm_15.png"></a>
</div>
<div style="margin-bottom:15px;">
<div class="scm-flotr2-metrics-company"
style="width:350px;height:250px;margin-bottom:5px;"
data-metrics="authors" data-legend="false"></div>
<i><b>Authors per month</b></i>
<a href="notes.html#note:charts:company:authors"><img src="qm_15.png"></a>
</div>
<div>
<div class="scm-flotr2-metrics-company"
style="width:350px;height:250px;margin-bottom:5px;"
data-metrics="added_lines,removed_lines" data-legend="true"></div>
<i><b>Lines added/removed per month</b></i>
<a href="notes.html#note:charts:company:lines"><img src="qm_15.png"></a>
</div>
</div>
<div style="float:left; margin-left:10px;">
<div class="info-pill">
<h1>Top authors (total)<a href="notes.html#note:tables:company:authors"><img src="qm_15.png"></a></h1>
<div class="scm-flotr2-top-company"
data-metric="authors" data-period="all" data-titles="false"></div>
</div>
<div class="info-pill">
<h1>Top authors (2006)<a href="notes.html#note:tables:company:authors"><img src="qm_15.png"></a></h1>
<div class="scm-flotr2-top-company"
data-metric="authors" data-period="2006" data-titles="false"></div>
</div>
<div class="info-pill">
<h1>Top authors (2009)<a href="notes.html#note:tables:company:authors"><img src="qm_15.png"></a></h1>
<div class="scm-flotr2-top-company"
data-metric="authors" data-period="2009" data-titles="false"></div>
</div>
<div class="info-pill">
<h1>Top authors (2012)<a href="notes.html#note:tables:company:authors"><img src="qm_15.png"></a></h1>
<div class="scm-flotr2-top-company"
data-metric="authors" data-period="2012" data-titles="false"></div>
</div>
</div>
</div>
<div id="footer"></div>
</div>
<!-- <script type="text/javascript" src="VizGrimoireJS/vizgrimoire.min.js"></script> -->
<script type="text/javascript" src="VizGrimoireJS/src/envision.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/DataSource.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Loader.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Report.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/ITS.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/MLS.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/SCM.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Envision_Report.js"></script>
<script type="text/javascript" src="VizGrimoireJS/src/Viz.js"></script>
</body>
</html>

2
custom.css Normal file
View File

@ -0,0 +1,2 @@
.subreport-list-item {float:right;height:100px;width:35%;}/* Shared CSS Style in all Envision Bitergia Reports */

View File

@ -0,0 +1,64 @@
# See the README for installation instructions.
JS_UGLIFY = uglifyjs
JSHINT = jshint
# CSSHINT = csslint
all: \
vizgrimoire.js \
vizgrimoire.min.js \
vizgrimoire.css
.INTERMEDIATE vizgrimoire.js: \
vizgrimoire.deps.js \
vizgrimoire.core.js
.INTERMEDIATE vizgrimoire.css: \
vizgrimoire.deps.css \
vizgrimoire.core.css
vizgrimoire.deps.js: \
src/License.js \
src/envision.js \
src/d3-treemap.min.js \
src/jquery.gridster.js
vizgrimoire.core.js: \
src/Envision_Report.js \
src/Loader.js \
src/Report.js \
src/DataSource.js \
src/Viz.js \
src/ITS.js \
src/MLS.js \
src/SCM.js \
src/Identity.js
vizgrimoire.deps.css: \
src/envision.min.css \
src/jquery.gridster.css
vizgrimoire.core.css: \
src/report.css \
src/report-envision.css
%.min.js: %.js Makefile
@rm -f $@
# $(JS_UGLIFY) -o $@ -c -m $<
$(JS_UGLIFY) -o $@ $<
vizgrimoire%js: Makefile
@rm -f $@
# @$(JSHINT) $(filter %.js,$^)
@cat $(filter %.js,$^) > $@
# @cat $(filter %.js,$^) > $@.tmp
# $(JS_UGLIFY) -o $@ $@.tmp
# @rm $@.tmp
@chmod a-w $@
vizgrimoire%css: Makefile
@rm -f $@
@cat $(filter %.css,$^) > $@
clean:
rm -f vizgrimoire*.js vizgrimoire*.css

View File

@ -0,0 +1,358 @@
var Dashboard = {};
(function() {
default_metrics = ['authors','closers','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 = ds.sortRepos(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 = ds.sortCompanies(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'];
$.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);
}
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};
$.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 = Viz.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);
});
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 day_msec = 1000*60*60*24;
var releases = {
// Apr 2011-Sep 2011
diablo: {
// start: 2011*12+4,
start: (new Date('2011-04').getTime())/(day_msec),
end: (new Date('2011-09').getTime())/(day_msec),
},
essex: {
start: (new Date('2011-09').getTime())/(day_msec),
end: (new Date('2012-04').getTime())/(day_msec),
},
folsom: {
start: (new Date('2012-04').getTime())/(day_msec),
end: (new Date('2012-09').getTime())/(day_msec),
},
grizzly: {
start: (new Date('2012-09').getTime())/(day_msec),
end: (new Date('2013-04').getTime())/(day_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();
});

View File

@ -0,0 +1,799 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
// TODO: Use attributes for getters and setters
function DataSource(name, basic_metrics) {
this.top_data_file = this.data_dir + '/'+this.name+'-top.json';
this.getTopDataFile = function() {
return this.top_data_file;
};
this.basic_metrics = basic_metrics;
this.getMetrics = function() {
return this.basic_metrics;
};
this.data_file = this.data_dir + '/'+this.name+'-evolutionary.json';
this.getDataFile = function() {
return this.data_file;
};
this.setDataFile = function(file) {
this.data_file = file;
};
this.data = null;
this.getData = function() {
return this.data;
};
this.setData = function(load_data, self) {
if (self === undefined) self = this;
self.data = load_data;
};
this.demographics_file = this.data_dir + '/'+this.name+'-demographics.json';
this.getDemographicsFile = function() {
return this.demographics_file;
};
this.demographics_data = null;
this.getDemographicsData = function() {
return this.demographics_data;
};
this.setDemographicsData = function(data, self) {
if (self === undefined) self = this;
self.demographics_data = data;
};
this.data_dir = 'data/json';
this.getDataDir = function() {
return this.data_dir;
};
this.setDataDir = function(dataDir) {
this.data_dir = dataDir;
this.data_file = dataDir + '/'+this.name+'-evolutionary.json';
this.demographics_file = dataDir + '/'+this.name+'-demographics.json';
this.global_data_file = dataDir + '/'+this.name+'-static.json';
this.top_data_file = dataDir + '/'+this.name+'-top.json';
this.companies_data_file = dataDir+'/'+ this.name +'-companies.json';
this.repos_data_file = dataDir+'/'+ this.name +'-repos.json';
this.countries_data_file = dataDir+'/'+ this.name +'-countries.json';
this.time_to_fix_data_file = dataDir+'/'+ this.name +'-quantiles-month-time_to_fix_hour.json';
};
this.global_data_file = this.data_dir + '/'+this.name+'-static.json';
this.getGlobalDataFile = function() {
return this.global_data_file;
};
this.global_data = null;
this.getGlobalData = function() {
return this.global_data;
};
this.setGlobalData = function(data, self) {
if (self === undefined) self = this;
self.global_data = data;
};
this.global_top_data = null;
this.getGlobalTopData = function() {
return this.global_top_data;
};
this.setGlobalTopData = function(data, self) {
if (self === undefined) self = this;
self.global_top_data = data;
};
this.addGlobalTopData = function(data, self, metric, period) {
if (period === undefined) period = "all";
if (self === undefined) self = this;
if (self.global_top_data === null)
self.global_top_data = {};
if (self.global_top_data[metric] === undefined)
self.global_top_data[metric] = {};
self.global_top_data[metric][period] = data;
};
this.name = name;
this.getName = function() {
return this.name;
};
this.people_data_file = this.data_dir + '/'+this.name+'-people.json';
this.getPeopleDataFile = function() {
return this.people_data_file;
};
this.people = null;
this.getPeopleData = function() {
return this.people;
};
this.setPeopleData = function(people, self) {
if (self === undefined) self = this;
self.people = people;
};
this.time_to_fix_data_file = this.data_dir + '/'+this.name
+ '-quantiles-month-time_to_fix_hour.json';
this.getTimeToFixDataFile = function() {
return this.time_to_fix_data_file;
};
this.time_to_fix_data = null;
this.getTimeToFixData = function() {
return this.time_to_fix_data;
};
this.setTimeToFixData = function(data, self) {
if (self === undefined) self = this;
self.time_to_fix_data = data;
};
this.time_to_attention_data_file = this.data_dir + '/'+this.name
+ '-quantiles-month-time_to_attention_hour.json';
this.getTimeToAttentionDataFile = function() {
return this.time_to_attention_data_file;
};
this.time_to_attention_data = null;
this.getTimeToAttentionData = function() {
return this.time_to_attention_data;
};
this.setTimeToAttentionData = function(data, self) {
if (self === undefined) self = this;
self.time_to_attention_data = data;
};
this.project = null;
this.getProject = function() {
return this.project;
};
this.setProject = function(project) {
this.project = project;
};
// Companies data
this.companies_data_file = this.data_dir+'/'+ this.name +'-companies.json';
this.getCompaniesDataFile = function() {
return this.companies_data_file;
};
this.companies = null;
this.getCompaniesData = function() {
return this.companies;
};
this.setCompaniesData = function(companies, self) {
if (companies === null) companies = [];
if (!(companies instanceof Array)) companies=[companies];
if (self === undefined) self = this;
self.companies = companies;
};
this.companies_metrics_data = {};
this.addCompanyMetricsData = function(company, data, self) {
if (self === undefined) self = this;
self.companies_metrics_data[company] = data;
};
this.getCompaniesMetricsData = function() {
return this.companies_metrics_data;
};
this.companies_global_data = {};
this.addCompanyGlobalData = function(company, data, self) {
if (self === undefined) self = this;
self.companies_global_data[company] = data;
};
this.getCompaniesGlobalData = function() {
return this.companies_global_data;
};
this.companies_top_data = {};
this.addCompanyTopData = function(company, data, self, period) {
if (period === undefined) period = "all";
if (self === undefined) self = this;
if (self.companies_top_data[company] === undefined)
self.companies_top_data[company] = {};
self.companies_top_data[company][period] = data;
};
this.getCompaniesTopData = function() {
return this.companies_top_data;
};
this.setCompaniesTopData = function(data, self) {
if (self === undefined) self = this;
self.companies_top_data = data;
};
// Repos data
this.repos_data_file =
this.data_dir+'/'+ this.name +'-repos.json';
this.getReposDataFile = function() {
return this.repos_data_file;
};
this.repos = null;
this.getReposData = function() {
return this.repos;
};
this.setReposData = function(repos, self) {
if (self === undefined) self = this;
if (!(repos instanceof Array)) repos=[repos];
self.repos = repos;
};
this.repos_metrics_data = {};
this.addRepoMetricsData = function(repo, data, self) {
if (self === undefined) self = this;
self.repos_metrics_data[repo] = data;
};
this.getReposMetricsData = function() {
return this.repos_metrics_data;
};
this.repos_global_data = {};
this.addRepoGlobalData = function(repo, data, self) {
if (self === undefined) self = this;
self.repos_global_data[repo] = data;
};
this.getReposGlobalData = function() {
return this.repos_global_data;
};
// Countries data
this.countries_data_file =
this.data_dir+'/'+ this.name +'-countries.json';
this.getCountriesDataFile = function() {
return this.countries_data_file;
};
this.countries = null;
this.getCountriesData = function() {
return this.countries;
};
this.setCountriesData = function(countries, self) {
if (self === undefined) self = this;
self.countries = countries;
};
this.countries_metrics_data = {};
this.addCountryMetricsData = function(country, data, self) {
if (self === undefined) self = this;
self.countries_metrics_data[country] = data;
};
this.getCountriesMetricsData = function() {
return this.countries_metrics_data;
};
this.countries_global_data = {};
this.addCountryGlobalData = function(country, data, self) {
if (self === undefined) self = this;
self.countries_global_data[country] = data;
};
this.getCountriesGlobalData = function() {
return this.countries_global_data;
};
// TODO: Move this login to Report
this.getCompanyQuery = function () {
var company = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "company")
company = querystr.split("&")[0].split("=")[1];
return company;
};
// TODO: data and projects should be in the same dictionary
this.displayBasicHTML = function(div_target, config, title) {
var full_data = [];
var projects = [];
var ds_name = this.getName();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getName() === ds_name) {
if (ds.getData() instanceof Array) return;
full_data.push(ds.getData());
projects.push(ds.getProject());
}
});
Viz.displayBasicHTML(full_data, div_target, this.getTitle(),
this.basic_metrics, this.name+'_hide', config, projects);
};
this.displayBasicMetricCompanies = function(metric_id,
div_target, config, limit, order_by) {
if (order_by === undefined) order_by = metric_id;
var companies_data = this.getCompaniesMetricsData();
if (limit) {
var sorted_companies = this.sortCompanies(order_by);
if (limit > sorted_companies.length)
limit = sorted_companies.length;
var companies_data_limit = {};
for (var i=0; i<limit; i++) {
var company = sorted_companies[i];
companies_data_limit[company] = companies_data[company];
}
companies_data = companies_data_limit;
}
Viz.displayBasicMetricCompaniesHTML(metric_id, companies_data,
div_target, config, limit);
};
this.displayBasicMetricMyCompanies = function(companies, metric_id,
div_target, config, start, end) {
var companies_data = {};
var self = this;
$.each(companies, function(i,name) {
companies_data[name] = self.getCompaniesMetricsData()[name];
});
Viz.displayBasicMetricCompaniesHTML(metric_id, companies_data,
div_target, config, start, end);
};
// TODO: mix with displayBasicMetricCompanies
this.displayBasicMetricRepos = function(metric_id,
div_target, config, limit, order_by) {
if (order_by === undefined) order_by = metric_id;
var repos_data = this.getReposMetricsData();
if (limit) {
var sorted_repos = this.sortRepos(order_by);
if (limit > sorted_repos.length)
limit = sorted_repos.length;
var repos_data_limit = {};
for (var i=0; i<limit; i++) {
var repo = sorted_repos[i];
repos_data_limit[repo] = repos_data[repo];
}
repos_data = repos_data_limit;
}
Viz.displayBasicMetricRepos(metric_id, repos_data,
div_target, config, limit);
};
this.displayBasicMetricMyRepos = function(repos, metric_id,
div_target, config, start, end) {
var repos_data = {};
var self = this;
$.each(repos, function(i,name) {
var metrics = self.getReposMetricsData()[name];
if (!metrics) {
name = Report.getReposMap()[name];
metrics = self.getReposMetricsData()[name];
}
repos_data[name] = metrics;
});
Viz.displayBasicMetricRepos(metric_id, repos_data,
div_target, config, start, end);
};
this.displayBasicMetricCompaniesStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("companies",metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricReposStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("repos", metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricCountriesStatic = function (metric_id,
div_target, config, limit, order_by, show_others) {
this.displayBasicMetricSubReportStatic ("countries", metric_id,
div_target, config, limit, order_by, show_others);
};
this.displayBasicMetricSubReportStatic = function (report, metric_id,
div_target, config, limit, order_by, show_others) {
if (order_by === undefined) order_by = metric_id;
var data = null;
if (report=="companies")
data = this.getCompaniesGlobalData();
else if (report=="repos")
data = this.getReposGlobalData();
else if (report=="countries")
data = this.getCountriesGlobalData();
else return;
if (limit) {
var sorted = null;
if (report=="companies")
sorted = this.sortCompanies(order_by);
else if (report=="repos")
sorted = this.sortRepos(order_by);
else if (report=="countries")
sorted = this.sortCountries(order_by);
if (limit > sorted.length) limit = sorted.length;
var data_limit = {};
for (var i=0; i<limit; i++) {
var item = sorted[i];
data_limit[item] = data[item];
}
// Add a final companies_data for the sum of other values
if (show_others) {
var others = 0;
for (var i=limit; i<sorted.length; i++) {
var item = sorted[i];
others += data[item][metric_id];
}
data_limit.others = {};
data_limit.others[metric_id] = others;
}
data = data_limit;
}
Viz.displayBasicMetricSubReportStatic(metric_id, data,
div_target, config, limit);
};
this.displayBasicMetricsCompany = function (
company, metrics, div_id, config) {
Viz.displayBasicMetricsCompany(company, metrics,
this.getCompaniesMetricsData()[company], div_id, config);
};
this.displayBasicMetricsRepo = function (repo, metrics, div_id, config) {
Viz.displayBasicMetricsRepo(repo, metrics,
this.getReposMetricsData()[repo], div_id, config);
};
this.displayBasicMetricsCountry = function (country, metrics, div_id, config) {
Viz.displayBasicMetricsCountry(country, metrics,
this.getCountriesMetricsData()[country], div_id, config);
};
this.displayBasicMetrics = function(metric_ids, div_target, config) {
Viz.displayBasicMetricsHTML(metric_ids, this.getData(),
div_target, config);
};
this.displayBasicMetricHTML = function(metric_id, div_target, config) {
var projects = [];
var full_data = [];
var ds_name = this.getName();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getName() === ds_name) {
if (ds.getData() instanceof Array) return;
full_data.push(ds.getData());
projects.push(ds.getProject());
}
});
Viz.displayBasicMetricHTML(this.basic_metrics[metric_id], full_data,
div_target, config, projects);
};
this.displayBasic = function() {
this.basicEvo(this.getData());
};
this.sortCompanies = function(metric_id) {
return this.sortGlobal(metric_id, "companies");
};
this.sortRepos = function(metric_id) {
return this.sortGlobal(metric_id, "repos");
};
this.sortCountries = function(metric_id) {
return this.sortGlobal(metric_id, "countries");
};
this.sortGlobal = function (metric_id, kind) {
if (metric_id === undefined) metric_id = "commits";
var metric = [];
var sorted = [];
var global = null;
if (kind === "companies") {
global = this.getCompaniesGlobalData();
if (this.getCompaniesData().length === 0) return sorted;
if (global[this.getCompaniesData()[0]][metric_id] === undefined)
metric_id = "commits";
}
else if (kind === "repos") {
global = this.getReposGlobalData();
if (this.getReposData().length === 0) return sorted;
if (global[this.getReposData()[0]][metric_id] === undefined)
metric_id = "commits";
}
else if (kind === "countries") {
global = this.getCountriesGlobalData();
if (this.getCountriesData().length === 0) return sorted;
if (global[this.getCountriesData()[0]][metric_id] === undefined)
metric_id = "commits";
}
$.each(global, function(item, data) {
metric.push([item, data[metric_id]]);
});
metric.sort(function(a, b) {return b[1] - a[1];});
$.each(metric, function(id, value) {
sorted.push(value[0]);
});
return sorted;
};
this.displayCompaniesNav = function (div_nav, sort_metric) {
var nav = "<span id='nav'></span>";
var sorted_companies = this.sortCompanies(sort_metric);
$.each(sorted_companies, function(id, company) {
nav += "<a href='#"+company+"-nav'>"+company + "</a> ";
});
$("#"+div_nav).append(nav);
};
this.displayCompaniesLinks = function (div_links, limit, sort_metric) {
var sorted_companies = this.sortCompanies(sort_metric);
var links = "";
var i = 0;
$.each(sorted_companies, function(id, company) {
links += '<a href="company.html?company='+company+'">'+company+'</a> | ';
if (i++>limit) return false;
});
$("#"+div_links).append(links);
};
this.displayCountriesNav = function (div_nav, sort_metric) {
var nav = "<span id='nav'></span>";
var sorted_countries = this.sortCountries(sort_metric);
$.each(sorted_countries, function(id, country) {
nav += "<a href='#"+country+"-nav'>"+country + "</a> ";
});
$("#"+div_nav).append(nav);
};
this.displayReposNav = function (div_nav, sort_metric, scm_and_its) {
var nav = "<span id='nav'></span>";
var sorted_repos = this.sortRepos(sort_metric);
$.each(sorted_repos, function(id, repo) {
if (scm_and_its && (!(Report.getReposMap()[repo]))) return;
nav += "<a href='#" + repo + "-nav'>";
var label = repo;
if (repo.lastIndexOf("http") === 0) {
var aux = repo.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
// label = repo.substr(repo.lastIndexOf("_") + 1);
}
else if (repo.lastIndexOf("<") === 0)
label = MLS.displayMLSListName(repo);
nav += label;
nav += "</a> ";
});
$("#" + div_nav).append(nav);
};
this.displayCompaniesList = function (metrics,div_id,
config_metric, sort_metric) {
this.displaySubReportList("companies",metrics,div_id,
config_metric, sort_metric);
};
this.displayReposList = function (metrics,div_id,
config_metric, sort_metric, scm_and_its) {
this.displaySubReportList("repos",metrics,div_id,
config_metric, sort_metric, scm_and_its);
};
this.displayCountriesList = function (metrics,div_id,
config_metric, sort_metric) {
this.displaySubReportList("countries",metrics,div_id,
config_metric, sort_metric);
};
this.displaySubReportList = function (report, metrics,div_id,
config_metric, sort_metric, scm_and_its) {
var list = "";
var ds = this;
var data = null, sorted = null;
if (report === "companies") {
data = this.getCompaniesMetricsData();
sorted = this.sortCompanies(sort_metric);
}
else if (report === "repos") {
data = this.getReposMetricsData();
sorted = this.sortRepos(sort_metric);
}
else if (report === "countries") {
data = this.getCountriesMetricsData();
sorted = this.sortCountries(sort_metric);
}
else return;
// Preserve order when float right
metrics.reverse();
$.each(sorted, function(id, item) {
if (scm_and_its && (!(Report.getReposMap()[item]))) return;
list += "<div class='subreport-list' id='"+item+"-nav'>";
list += "<div style='float:left;'>";
if (report === "companies")
list += "<a href='company.html?company="+item+"'>";
else if (report === "repos") {
list += "<a href='";
// Show together SCM and ITS
if ((ds.getName() === "scm" || ds.getName() === "its") &&
(Report.getReposMap().length === undefined)) ;
else
list += ds.getName()+"-";
list += "repository.html";
list += "?repository="+item;
list += "&data_dir=" + Report.getDataDir();
list += "'>";
}
else if (report === "countries") {
list += "<a href='"+ds.getName();
list += "-country.html?country="+item;
list += "&data_dir=" + Report.getDataDir();
list += "'>";
}
list += "<strong>";
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
// label = item.substr(item.lastIndexOf("_") + 1);
}
else if (item.lastIndexOf("<") === 0)
label = MLS.displayMLSListName(item);
list += label;
list += "</strong> +info</a>";
list += "<br><a href='#nav'>^</a>";
list += "</div>";
$.each(metrics, function(id, metric) {
list += "<div id='"+item+"-"+metric+"'";
list +=" class='subreport-list-item'></div>";
});
list += "</div>";
});
$("#"+div_id).append(list);
// Draw the graphs
$.each(sorted, function(id, item) {
if (scm_and_its && (!(Report.getReposMap()[item]))) return;
$.each(metrics, function(id, metric) {
var item_data = data[item];
if (item_data[metric] === undefined && report === "repos") {
// Hack to support showing ITS+SCM metrics in repos
var map_repo = Report.getReposMap()[item];
if (map_repo) {
new_data = ds.getITS().getReposMetricsData()[map_repo];
item_data = new_data;
}
else return;
}
var div_id = item+"-"+metric;
var items = {};
items[item] = item_data;
var title = metric;
Viz.displayMetricSubReportLines(div_id, metric, items, title);
});
});
};
this.displayCompanySummary = function(divid, company, ds) {
this.displaySubReportSummary("companies",divid, company, ds);
};
this.displayRepoSummary = function(divid, repo, ds) {
this.displaySubReportSummary("repositories",divid, repo, ds);
};
this.displayCountrySummary = function(divid, repo, ds) {
this.displaySubReportSummary("countries",divid, repo, ds);
};
this.displayCompaniesSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total companies: " + data.companies +"<br>";
html += "Companies in 2006: " + data.companies_2006+"<br>";
html += "Companies in 2009: " + data.companies_2009+"<br>";
html += "Companies in 2012: " + data.companies_2012+"<br>";
$("#"+divid).append(html);
};
this.displaySubReportSummary = function(report, divid, item, ds) {};
this.displayReposSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total repositories: " + data.repositories +"<br>";
$("#"+divid).append(html);
};
this.displayCountriesSummary = function(divid, ds) {
var html = "";
var data = ds.getGlobalData();
html += "Total countries: " + data.countries +"<br>";
$("#"+divid).append(html);
};
this.displayDemographics = function(divid, file, period) {
Viz.displayDemographics(divid, this, file, period);
};
this.displayTimeToAttention = function(div_id, column, labels, title) {
var labels = true;
var title = "Time to Attention " + column;
Viz.displayTimeToAttention(div_id, this.getTimeToAttentionData(), column, labels, title);
};
this.displayTimeToFix = function(div_id, column, labels, title) {
var labels = true;
var title = "Time to Fix " + column;
Viz.displayTimeToFix(div_id, this.getTimeToFixData(), column, labels, title);
};
this.displayTop = function(div, all, show_metric, graph) {
if (all === undefined) all = true;
Viz.displayTop(div, this, all, show_metric, graph);
};
this.displayTopBasic = function(div, action, doer, graph) {
Viz.displayTopBasic(div, this, action, doer, graph);
};
this.displayTopCompany = function(company, div, metric, period, titles) {
Viz.displayTopCompany(company, div, this, metric, period, titles);
};
this.displayTopGlobal = function(div, metric, period, titles) {
Viz.displayTopGlobal(div, this, metric, period, titles);
};
this.basicEvo = function(history) {
for (var id in this.basic_metrics) {
var metric = this.basic_metrics[id];
if ($.inArray(metric.column, Report.getConfig()[this.getName()+"_hide"]) > -1)
continue;
if ($('#' + metric.divid).length)
Viz.displayBasicLines(metric.divid, history, metric.column,
true, metric.name);
}
};
this.envisionEvo = function(div_id, history, relative) {
config = Report.getConfig();
var options = Viz.getEnvisionOptions(div_id, history, this.getName(),
Report.getConfig()[this.getName()+"_hide"]);
if (relative)
Viz.addRelativeValues(options.data, this.getMainMetric());
new envision.templates.Envision_Report(options, [ this ]);
};
this.displayEvo = function(divid, relative) {
var projects_full_data = Report.getProjectsDataSources();
this.envisionEvo(divid, projects_full_data, relative);
};
}

View File

@ -0,0 +1,286 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
(function() {
var V = envision, global_data = {};
function getDefaultsMarkers(option, markers, dates) {
var mark = "";
if (!markers || markers.length === 0) return mark;
for ( var i = 0; i < markers.date.length; i++) {
if (markers.date[i] == dates[option.index]) {
mark = markers.marks[i];
}
}
return mark;
}
function getEnvisionDefaultsGraph(name, gconfig) {
var graph = {
name : name,
config : {
colors : gconfig.colors,
grid: {verticalLines:false, horizontalLines:false},
mouse : {
// container: $("#all-envision-legend"),
track : true,
trackY : false,
position : 'ne'
},
yaxis : {
min : 0,
autoscale : true
},
legend : {
show: false,
backgroundColor : '#FFFFFF',
backgroundOpacity : 0
},
}
};
if (gconfig.gtype === "whiskers")
graph.config.whiskers = {
show : true,
lineWidth : 2
};
else
graph.config['lite-lines'] = {
lineWidth : 2,
show : true,
fill : false,
fillOpacity : 0.5
};
if (gconfig.y_labels)
graph.config.yaxis = {
showLabels : true,
min : 0
};
if (gconfig.show_markers)
graph.config.markers = {
show : true,
position : 'ct',
labelFormatter : function(o) {
return getDefaultsMarkers(o, gconfig.markers, gconfig.dates);
}
};
return graph;
}
function getDefaultsMetrics(DS, viz, metrics, default_config) {
$.each(metrics, function(metric, value) {
config = default_config;
if (value.envision)
config = Viz.mergeConfig(default_config,
value.envision);
if ($.inArray(metric, global_data.envision_hide) === -1) {
viz[metric] = getEnvisionDefaultsGraph
('report-' + DS.getName() + '-' + metric, config);
viz[metric].config.subtitle = metric;
if (DS.getMainMetric() == metric) {
// Create graph also for relative data
viz[metric+"_relative"] = getEnvisionDefaultsGraph
('report-' + DS.getName() + '-' + metric+"_relative", config);
viz[metric].config['lite-lines'] = {show:false};
viz[metric].config['lines'] = {
lineWidth : 1,
show : true,
stacked: true,
fill : true,
fillOpacity : 1
};
}
}
});
}
function getDefaults(ds) {
//var defaults_colors = [ '#ffa500', '#ffff00', '#00ff00', '#4DA74D',
// '#9440ED' ];
var defaults_colors = [ '#ffa500', '#00A8F0', '#C0D800', '#ffff00', '#00ff00', '#4DA74D',
'#9440ED' ];
var default_config = {
colors : defaults_colors,
dates : global_data.dates,
g_type : '',
markers : global_data.markers,
y_labels : false
};
var data_sources = Report.getDataSources();
var viz = {};
var metrics = {};
if (!ds) {
$.each(data_sources, function(i, DS) {
metrics = DS.getMetrics();
getDefaultsMetrics(DS, viz, metrics, default_config);
});
} else {
$.each(data_sources, function(i, DS) {
if ($.inArray(DS.getName(), ds) > -1) {
metrics = DS.getMetrics();
getDefaultsMetrics(DS, viz, metrics, default_config);
}
});
}
config = default_config;
viz.summary = getEnvisionDefaultsGraph('report-summary', config);
viz.summary.config.xaxis = {
noTickets : 10,
showLabels : true
};
viz.summary.config.handles = {
show : true
};
viz.summary.config.selection = {
mode : 'x'
};
viz.summary.config.mouse = {};
viz.connection = {
name : 'report-connection',
adapterConstructor : V.components.QuadraticDrawing
};
return viz;
}
function getOrderedDataSources(ds_list, main_metric) {
var ordered = [];
var main_DS = null;
$.each(ds_list, function(i, DS) {
if (DS.getMetrics()[main_metric]) {
main_DS = DS;
return false;
}
});
ordered.push(main_DS);
$.each(ds_list, function(i, DS) {
if (DS===main_DS) return;
ordered.push(DS);
});
return ordered;
}
function Envision_Report(options, data_sources) {
var main_metric = options.data.main_metric;
global_data = options.data;
if (!data_sources) data_sources = Report.getDataSources();
data_sources = getOrderedDataSources(data_sources, main_metric);
var ds = [];
for ( var i = 0; i < data_sources.length; i++) {
if (data_sources[i].getData().length === 0) continue;
ds.push(data_sources[i].getName());
}
var data = options.data, defaults = getDefaults(ds),
vis = new V.Visualization(
{
name : 'report-' + ds.join(",")
}), selection = new V.Interaction(), hit = new V.Interaction();
var metrics = {};
$.each(data_sources, function(i, DS) {
if (DS.getData().length === 0) return;
metrics = $.extend(metrics, DS.getMetrics());
});
$.each(metrics, function(metric, value) {
if ($.inArray(metric, data.envision_hide) !== -1) return;
if (data[metric] === undefined) return;
defaults[metric].data = data[metric];
// The legend is different if the metric is not in all projects
if (defaults[metric].data.length <
Report.getProjectsList().length)
defaults[metric].config.legend.show = true;
if (data[metric+"_relative"])
defaults[metric].data = data[metric+"_relative"];
});
defaults.summary.data = data.summary;
// SHOW MOUSE LEGEND AND LEGEND
defaults[main_metric].config.legend.show = true;
defaults[main_metric].config.mouse.trackFormatter = options.trackFormatter;
if (options.xTickFormatter) {
defaults.summary.config.xaxis.tickFormatter = options.xTickFormatter;
}
defaults[main_metric].config.yaxis.tickFormatter = options.yTickFormatter ||
function(n) {
return '$' + n;
};
// ENVISION COMPONENTS
var components = {};
$.each(metrics, function(metric, value) {
if (data[metric] === undefined) return;
if ($.inArray(metric, data.envision_hide) === -1) {
components[metric] = new V.Component(defaults[metric]);
}
});
connection = new V.Component(defaults.connection);
summary = new V.Component(defaults.summary);
// VISUALIZATION
$.each(components, function(component, value) {
vis.add(value);
});
vis
.add(connection).add(summary)
.render(options.container);
// ZOOMING
$.each(components, function(component, value) {
selection.follower(value);
});
selection.follower(connection).leader(summary).add(V.actions.selection,
options.selectionCallback ? {
callback : options.selectionCallback
} : null);
// HIT
var hit_group = [];
$.each(components, function(component, value) {
hit_group.push(value);
});
hit.group(hit_group).add(V.actions.hit);
// INITIAL SELECTION
if (options.selection) {
summary.trigger('select', options.selection);
}
}
V.templates.Envision_Report = Envision_Report;
})();

View File

@ -0,0 +1,180 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function ITS() {
var basic_metrics = {
'opened' : {
'divid' : 'its-opened',
'column' : "opened",
'name' : "Opened",
'desc' : "Number of opened tickets",
'envision' : {
y_labels : true,
show_markers : true
}
},
'openers' : {
'divid' : 'its-openers',
'column' : "openers",
'name' : "Openers",
'desc' : "Unique identities opening tickets",
'action' : "opened",
'envision' : {
gtype : 'whiskers'
}
},
'closed' : {
'divid' : 'its-closed',
'column' : "closed",
'name' : "Closed",
'desc' : "Number of closed tickets"
},
'closers' : {
'divid' : 'its-closers',
'column' : "closers",
'name' : "Closers",
'desc' : "Number of identities closing tickets",
'action' : "closed",
'envision' : {
gtype : 'whiskers'
}
},
'changed' : {
'divid' : 'its-changed',
'column' : "changed",
'name' : "Changed",
'desc' : "Number of changes to the state of tickets"
},
'changers' : {
'divid' : 'its-changers',
'column' : "changers",
'name' : "Changers",
'desc' : "Number of identities changing the state of tickets",
'action' : "changed",
'envision' : {
gtype : 'whiskers'
}
}
};
this.getMetrics = function() {return basic_metrics;};
this.getMainMetric = function() {
return "opened";
};
this.setReposData = function(repos_name, self) {
if (self === undefined) self = this;
if (!(repos_name instanceof Array)) repos_name=[repos_name];
var repos = [];
// convert http://issues.liferay.com/browse/AUI, change "/" by "_"
for (var i=0; i<repos_name.length; i++) {
repos.push(repos_name[i].replace(/\//g,"_"));
}
self.repos = repos;
};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0)
label = item.substr(item.lastIndexOf("_") + 1);
var html = "<h1>" + label + "</h1>";
var id_label = {
opened : "Opened",
openers : "Openers",
first_date : "Start",
last_date : "End",
closers : "Closers",
closed : "Closed",
changers : "Changers",
changed: "Changed",
tickets: "Tickets",
trackers: "Trackers"
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
else if (report === "countries")
global_data = ds.getCountriesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .its-info').hide();
return;
}
$(div_id + ' #its_type').text(this.global_data.type);
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().its_url;
}
if (this.global_data.type === "allura")
url = url.replace("rest/","");
else if (this.global_data.type === "github") {
url = url.replace("api.","");
url = url.replace("repos/","");
}
$(div_id + ' #its_url').attr("href", url);
$(div_id + ' #its_name').text("Tickets " + this.global_data.type);
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #itsFirst').text(data.first_date);
$(div_id + ' #itsLast').text(data.last_date);
$(div_id + ' #itsTickets').text(data.tickets);
$(div_id + ' #itsOpeners').text(data.openers);
$(div_id + ' #itsRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #itsRepositories').hide();
};
this.getTitle = function() {return "Tickets";};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "opened", "openers", radius);
};
}
var aux = new ITS();
ITS.prototype = new DataSource("its", aux.getMetrics());

View File

@ -0,0 +1,110 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Identity = {};
(function() {
var unique_list = "unique-sortable";
function sortSelList(list_divid, list, name) {
var connect = "";
list_divid === unique_list ? connect ="" : connect = unique_list;
$('#'+name).sortable({
handle: ".handle",
connectWith: "#"+connect,
start: function(e, info) {
info.item.siblings(".ui-selected").appendTo(info.item);
},
stop: function(e, info) {
if (info.item.parent()[0].id === unique_list)
info.item.find('.handle').remove();
info.item.parent().append(info.item.find("li"));
info.item.parent().find("li")
.addClass("mjs-nestedSortable-leaf");
// TODO remove from data source filtering data
}
}).selectable()
.find('li')
.prepend( "<div class='handle'></div>" );
}
Identity.showListNested = function(list_divid, ds) {
list ='<ol id='+unique_list+' class="nested_sortable" ';
list += 'style="padding: 5px; background: #eee;"></ol>';
$('#'+list_divid).append(list);
$('#'+unique_list).nestedSortable({
forcePlaceholderSize: true,
handle: 'div',
helper: 'clone',
items: 'li',
tolerance: 'pointer',
toleranceElement: '> div',
maxLevels: 2,
isTree: true,
expandOnHover: 700,
startCollapsed: true
});
$('.disclose').on('click', function() {
$(this).closest('li').toggleClass('mjs-nestedSortable-collapsed')
.toggleClass('mjs-nestedSortable-expanded');
});
};
function showFilter (ds, filter_data) {
$('#'+ds.getName()+'filter').autocomplete({
source: filter_data,
select: function( event, ui ) {
$("#"+ds.getName()+"filter").val('');
$("#"+ds.getName()+"_people_"+ui.item.value).addClass('ui-selected');
return false;
}
});
}
Identity.showList = function(list_divid, ds) {
var list ="";
var people = ds.getPeopleData();
var filter_data = [];
list ='<ol id="'+ds.getName()+'-sortable" class="sortable">';
for (var i=0; i<people.id.length; i++) {
var value = people.id[i];
if (typeof value === "string") {
value = value.replace("@", "_at_").replace(".","_");
}
filter_data.push({value:value, label:people.name[i]});
list += '<li id="'+ds.getName()+'_people_'+value+'" ';
list += 'class="ui-widget-content ui-selectee">';
list += '<div><span class="disclose"><span></span></span>';
list += people.id[i] +' ' + people.name[i];
list += '</div></li>';
}
list += '</ol>';
$('#'+list_divid).append("<input id='"+ds.getName()+"filter'>");
showFilter(ds, filter_data);
$('#'+list_divid).append(list);
sortSelList(list_divid, list, ds.getName()+"-sortable");
};
})();

View File

@ -0,0 +1,31 @@
/*
* VizGrimoire.js - https://github.com/VizGrimoire/VizGrimoireJS
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*
* Underscore.js 1.1.7 (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. MIT license
* bean.js - copyright Jacob Thornton 2011, MIT license
* Flotr2 (c) 2012 Carl Sutherland, MIT license
* Bonzo: DOM Utility (c) Dustin Diaz 2011, MIT license
* Envision.js (c) 2012 Carl Sutherland, Humble Software, MIT license
* gridster.js Copyright (c) 2012 ducksboard; Licensed MIT
* d3.js: Copyright (c) 2012, Michael Bostocks
*
*/
;

View File

@ -0,0 +1,385 @@
/*
* Copyright (C) 2012-2013 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Loader = {};
(function() {
var data_callbacks = [];
var data_global_callbacks = [];
var check_companies = false, check_repos = false, check_countries = false;
Loader.data_ready = function(callback) {
data_callbacks.push(callback);
};
Loader.data_ready_global = function(callback) {
data_global_callbacks.push(callback);
};
Loader.data_load = function () {
data_load_file(Report.getProjectFile(),
function(data, self) {Report.setProjectData(data);});
data_load_file(Report.getConfigFile(),
function(data, self) {Report.setConfig(data);});
data_load_file(Report.getMarkersFile(),
function(data, self) {Report.setMarkers(data);});
var projects_dirs = Report.getProjectsDirs();
for (var i=0; i<projects_dirs.length; i++) {
var data_dir = projects_dirs[i];
var prj_file = Report.getDataDir() + "/project-info.json";
data_load_file(prj_file, function(data, dir) {
if (data.project_name === undefined) {
data.project_name = dir.replace("data/json","")
.replace(/\.\.\//g,"");
}
var projects_data = Report.getProjectsData();
projects_data[data.project_name] = {dir:dir,url:data.project_url};
}, data_dir);
}
data_load_companies();
data_load_repos();
data_load_countries();
data_load_metrics();
data_load_people();
data_load_tops('authors');
data_load_time_to_fix();
data_load_time_to_attention();
};
function data_load_companies() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getCompaniesDataFile(),
DS.setCompaniesData, DS);
});
}
function data_load_file(file, fn_data_set, self) {
$.when($.getJSON(file)).done(function(history) {
fn_data_set(history, self);
end_data_load();
}).fail(function() {
fn_data_set([], self);
end_data_load();
});
};
function data_load_repos() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getReposDataFile(), DS.setReposData, DS);
});
// Repositories mapping between data sources
data_load_file(Report.getReposMapFile(), Report.setReposMap);
};
function data_load_countries() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getCountriesDataFile(), DS.setCountriesData, DS);
});
};
function data_load_time_to_fix() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getTimeToFixDataFile(), DS.setTimeToFixData, DS);
});
};
function data_load_time_to_attention() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getTimeToAttentionDataFile(), DS.setTimeToAttentionData, DS);
});
};
// TODO: It is better to have all the tops in the same file
// we should move data load from Viz.displayTop here
function data_load_tops(metric) {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
// TODO: Support for SCM only in Webkit
if (DS.getName() !== "scm") {
DS.setGlobalTopData([], DS);
return;
}
var file_static = DS.getDataDir() + "/"+ DS.getName()+"-top-"+metric;
var file_all = file_static + ".json";
var file_2006 = file_static + "_2006.json";
var file_2009 = file_static + "_2009.json";
var file_2012 = file_static + "_2012.json";
$.when($.getJSON(file_all),
$.getJSON(file_2006),
$.getJSON(file_2009),
$.getJSON(file_2012)
).done(function(history, hist2006, hist2009, hist2012) {
DS.addGlobalTopData(history[0], DS, metric, "all");
DS.addGlobalTopData(hist2006[0], DS, metric, "2006");
DS.addGlobalTopData(hist2009[0], DS, metric, "2009");
DS.addGlobalTopData(hist2012[0], DS, metric, "2012");
end_data_load();
}).fail(function() {
DS.setGlobalTopData([], DS);
end_data_load();
});
});
};
function data_load_companies_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var companies = DS.getCompaniesData();
if (!companies) return;
$.each(companies, function(i, company) {
var file = DS.getDataDir()+"/"+company+"-";
var file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addCompanyMetricsData(company, history, DS);
end_data_load();
});
var file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addCompanyGlobalData(company, history, DS);
end_data_load();
});
var file_static = file + DS.getName()+"-top-";
if (DS.getName() === "scm") file_static += "authors";
if (DS.getName() === "its") file_static += "closers";
if (DS.getName() === "mls") file_static += "senders";
var file_all = file_static + ".json";
$.when($.getJSON(file_all))
.done(function(history) {
DS.addCompanyTopData(company, history, DS, "all");
end_data_load();
}).fail(function() {
DS.setCompaniesTopData([], self);
end_data_load();
});
});
});
}
function data_load_repos_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var repos = DS.getReposData();
if (repos === null) return;
$.each(repos, function(i, repo) {
var file = DS.getDataDir()+"/"+repo+"-";
file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addRepoMetricsData(repo, history, DS);
end_data_load();
});
file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addRepoGlobalData(repo, history, DS);
end_data_load();
});
});
});
}
function data_load_countries_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
var countries = DS.getCountriesData();
if (countries === null) return;
$.each(countries, function(i, country) {
var file = DS.getDataDir()+"/"+country+"-";
file_evo = file + DS.getName()+"-evolutionary.json";
$.when($.getJSON(file_evo)).done(function(history) {
DS.addCountryMetricsData(country, history, DS);
end_data_load();
});
file_static = file + DS.getName()+"-static.json";
$.when($.getJSON(file_static)).done(function(history) {
DS.addCountryGlobalData(country, history, DS);
end_data_load();
});
});
});
}
function data_load_metrics() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getDataFile(), DS.setData, DS);
data_load_file(DS.getGlobalDataFile(), DS.setGlobalData, DS);
// TODO: Demographics just for SCM yet!
if (DS instanceof SCM) {
data_load_file(DS.getDemographicsFile(), DS.setDemographicsData, DS);
}
if (DS instanceof MLS) {
data_load_file(DS.getListsFile(), DS.setListsData, DS);
}
});
}
function data_load_people() {
var data_sources = Report.getDataSources();
$.each(data_sources, function(i, DS) {
data_load_file(DS.getPeopleDataFile(), DS.setPeopleData, DS);
});
}
function check_companies_loaded(DS) {
if (DS.getCompaniesData() === null) return false;
else {
if (DS.getCompaniesData().length>0 && !check_companies) {
check_companies = true;
data_load_companies_metrics();
return false;
}
}
if (check_companies && DS.getCompaniesData().length>0) {
var companies_loaded = 0;
for (var key in DS.getCompaniesMetricsData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
companies_loaded = 0;
for (var key in DS.getCompaniesGlobalData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
if (DS.getCompaniesTopData() === null) return false;
companies_loaded = 0;
for (var key in DS.getCompaniesTopData()) {companies_loaded++;}
if (companies_loaded !== DS.getCompaniesData().length)
return false;
}
return true;
}
function check_repos_loaded(DS) {
if (DS.getReposData() === null) return false;
else {
if (DS.getReposData().length>0 && !check_repos) {
check_repos = true;
data_load_repos_metrics();
return false;
}
}
if (check_repos && DS.getReposData().length>0) {
var repos_loaded = 0;
for (var key in DS.getReposMetricsData()) {repos_loaded++;}
if (repos_loaded !== DS.getReposData().length) return false;
repos_loaded = 0;
for (var key in DS.getReposGlobalData()) {repos_loaded++;}
if (repos_loaded !== DS.getReposData().length) return false;
}
return true;
}
function check_countries_loaded(DS) {
if (DS.getCountriesData() === null) return false;
else {
if (DS.getCountriesData().length>0 && !check_countries) {
check_countries = true;
data_load_countries_metrics();
return false;
}
}
if (check_countries && DS.getCountriesData().length>0) {
var countries_loaded = 0;
for (var key in DS.getCountriesMetricsData()) {countries_loaded++;}
if (countries_loaded !== DS.getCountriesData().length) return false;
countries_loaded = 0;
for (var key in DS.getCountriesGlobalData()) {countries_loaded++;}
if (countries_loaded !== DS.getCountriesData().length) return false;
}
return true;
}
function check_projects_loaded() {
var projects_loaded = 0;
var projects_data = Report.getProjectsData();
var projects_dirs = Report.getProjectsDirs();
for (var key in projects_data) {projects_loaded++;}
if (projects_loaded < projects_dirs.length ) return false;
return true;
}
function check_data_loaded_global() {
var check = true;
if (Report.getProjectData() === null ||
Report.getConfig() === null || Report.getMarkers() === null)
return false;
if (!(check_projects_loaded())) return false;
var data_sources = Report.getDataSources();
$.each(data_sources, function(index, DS) {
if (DS.getData() === null) {check = false; return false;}
if (DS.getGlobalData() === null) {check = false; return false;}
if (DS.getGlobalTopData() === null) {check = false; return false;}
if (DS.getTimeToFixData() === null) {check = false; return false;}
});
return check;
}
function check_data_loaded() {
var check = true;
if (!(check_data_loaded_global())) return false;
var data_sources = Report.getDataSources();
$.each(data_sources, function(index, DS) {
if (DS.getPeopleData() === null) {check = false; return false;}
if (!check_companies_loaded(DS)) {check = false; return false;}
if (!check_repos_loaded(DS)) {check = false; return false;}
if (!check_countries_loaded(DS)) {check = false; return false;}
// TODO: Demographics just for SCM yet!
if (DS instanceof SCM) {
if (DS.getDemographicsData() === null) {check = false; return false;}
}
if (DS instanceof MLS) {
if (DS.getListsData() === null) {check = false; return false;}
}
});
return check;
}
// Two steps data loading
function end_data_load() {
if (check_data_loaded_global()) {
for ( var i = 0; i < data_global_callbacks.length; i++) {
data_global_callbacks[i]();
}
data_global_callbacks = [];
}
if (check_data_loaded()) {
// Invoke callbacks informing all data needed has been loaded
for ( var i = 0; i < data_callbacks.length; i++) {
data_callbacks[i]();
}
}
};
})();

View File

@ -0,0 +1,500 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function MLS() {
var self = this;
var basic_metrics = {
'sent' : {
'divid' : "mls-sent",
'column' : "sent",
'name' : "Sent",
'desc' : "Number of messages"
},
'senders' : {
'divid' : "mls-senders",
'column' : "senders",
'name' : "Senders",
'desc' : "Number of unique message senders",
'action' : "sent"
}
};
this.data_lists_file = this.data_dir + '/mls-lists.json';
this.getListsFile = function() {return this.data_lists_file;};
this.data_lists = null;
this.getListsData = function() {return this.data_lists;};
this.setListsData = function(lists, self) {
if (self === undefined) self = this;
self.data_lists = lists;
};
this.setDataDir = function(dataDir) {
this.data_dir = dataDir;
this.data_lists_file = this.data_dir + '/mls-lists.json';
MLS.prototype.setDataDir.call(this, dataDir);
};
this.getMainMetric = function() {
return "sent";
};
this.getMetrics = function() {return basic_metrics;};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
}
var html = "<h1>" + label + "</h1>";
var id_label = {
sent: "Sent",
senders: "Senders",
first_date : "Start",
last_date : "End",
repositories: "Repositories"
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
if (report === "countries")
global_data = ds.getCountriesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .mls_info').hide();
return;
}
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().mls_url;
}
if (this.global_data.type)
$(div_id + ' #mls_type').text(this.global_data.type);
if (this.global_data.url && this.global_data.url !== "." && this.global_data.type !== undefined) {
$(div_id + ' #mls_url').attr("href", url);
$(div_id + ' #mls_name').text("MLS " + this.global_data.type);
} else {
$(div_id + ' #mls_url').attr("href", Report.getProjectData().mls_url);
$(div_id + ' #mls_name').text(Report.getProjectData().mls_name);
$(div_id + ' #mls_type').text(Report.getProjectData().mls_type);
}
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #mlsFirst').text(data.first_date);
$(div_id + ' #mlsLast').text(data.last_date);
$(div_id + ' #mlsMessages').text(data.sent);
$(div_id + ' #mlsSenders').text(data.senders);
$(div_id + ' #mlsRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #mlsRepositories').hide();
};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "sent", "senders", radius);
};
// http:__lists.webkit.org_pipermail_squirrelfish-dev_
// <allura-dev.incubator.apache.org>
MLS.displayMLSListName = function (listinfo) {
var list_name_tokens = listinfo.split("_");
var list_name = '';
if (list_name_tokens.length > 1) {
list_name = list_name_tokens[list_name_tokens.length - 1];
if (list_name === "")
list_name = list_name_tokens[list_name_tokens.length - 2];
} else {
list_name = listinfo.replace("<", "");
list_name = list_name.replace(">", "");
list_name_tokens = list_name.split(".");
list_name = list_name_tokens[0];
}
return list_name;
}
function getUserLists() {
var form = document.getElementById('form_mls_selector');
var lists = [];
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].checked)
lists.push(form.elements[i].value);
}
if (localStorage) {
localStorage.setItem(getMLSId(), JSON.stringify(lists));
}
return lists;
}
this.displayBasicUserAll = function (id, all) {
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox")
form.elements[i].checked = all;
}
this.displayBasicUser(id);
};
this.displayBasicUser = function(div_id) {
$("#" + div_id).empty();
lists = getUserLists();
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
file_messages = this.getDataDir()+"/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
displayBasicList(div_id, l, file_messages);
}
};
this.displayBasic = function (div_id, config_metric) {
var lists = this.getListsData();
lists_hide = Report.getConfig().mls_hide_lists;
lists = lists.mailing_list;
if (lists === undefined) return null;
var user_pref = false;
if (typeof lists === 'string')
lists = [ lists ];
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
lists = JSON.parse(localStorage.getItem(getMLSId()));
user_pref = true;
}
}
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
if (!user_pref)
if ($.inArray(l, lists_hide) > -1)
continue;
file_messages = this.getDataDir()+ "/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
displayBasicList(div_id, l, file_messages, config_metric);
}
};
this.getTitle = function() {return "Mailing Lists";};
// TODO: use cache to store mls_file and check it!
function displayBasicList(div_id, l, mls_file, config_metric) {
var config = Viz.checkBasicConfig(config_metric);
for ( var id in basic_metrics) {
var metric = basic_metrics[id];
var title = '';
if (config.show_title)
title = metric.name;
if ($.inArray(metric.column, Report.getConfig().mls_hide) > -1)
continue;
var new_div = "<div class='info-pill m0-box-div flotr2-"
+ metric.column + "'>";
new_div += "<h1>" + metric.name + " " + MLS.displayMLSListName(l)
+ "</h1>";
new_div += "<div id='" + metric.divid + "_" + l
+ "' class='m0-box flotr2-" + metric.column + "'></div>";
if (config.show_desc)
new_div += "<p>" + metric.desc + "</p>";
new_div += "</div>";
$("#" + div_id).append(new_div);
Viz.displayBasicLinesFile(metric.divid + '_' + l, mls_file,
metric.column, config.show_labels, title);
}
}
function getReportId() {
var project_data = Report.getProjectData();
return project_data.date + "_" + project_data.project_name;
}
function getMLSId() {
return getReportId() + "_mls_lists";
}
this.displayEvoListsMain = function (id) {
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
lists = JSON.parse(localStorage.getItem(getMLSId()));
return this.displayEvoLists(id, lists);
}
}
history = this.getListsData();
lists = history.mailing_list;
if (lists === undefined) return;
var config = Report.getConfig();
lists_hide = config.mls_hide_lists;
if (typeof lists === 'string') {
lists = [ lists ];
}
var filtered_lists = [];
for ( var i = 0; i < lists.length; i++) {
if ($.inArray(lists[i], lists_hide) == -1)
filtered_lists.push(lists[i]);
}
if (localStorage) {
if (!localStorage.getItem(getMLSId())) {
localStorage.setItem(getMLSId(), JSON
.stringify(filtered_lists));
}
}
this.displayEvoLists(id, filtered_lists);
};
function cleanLocalStorage() {
if (localStorage) {
if (localStorage.length && localStorage.getItem(getMLSId())) {
localStorage.removeItem(getMLSId());
}
}
}
this.getDefaultLists = function () {
var default_lists = [];
var hide_lists = Report.getConfig().mls_hide_lists;
$.each(this.getListsData().mailing_list, function(index,list) {
if ($.inArray(list, hide_lists) === -1) default_lists.push(list);
});
return default_lists;
};
this.displaySelectorCheckDefault = function () {
var default_lists = this.getDefaultLists();
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox") {
var id = form.elements[i].id;
l = id.split("_check")[0];
if ($.inArray(l, default_lists) > -1)
form.elements[i].checked = true;
else form.elements[i].checked = false;
}
}
};
this.displayBasicDefault = function (div_id) {
var obj = self;
if (this instanceof MLS) obj = this;
cleanLocalStorage();
obj.displaySelectorCheckDefault();
$("#" + div_id).empty();
obj.displayBasic(div_id);
};
this.displayEvoDefault = function (div_id) {
var obj = self;
if (this instanceof MLS) obj = this;
cleanLocalStorage();
if (document.getElementById('form_mls_selector'))
obj.displaySelectorCheckDefault();
$("#" + div_id).empty();
obj.displayEvoLists(div_id, obj.getDefaultLists());
};
this.displayEvoUserAll = function (id, all) {
var form = document.getElementById('form_mls_selector');
for ( var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "checkbox")
form.elements[i].checked = all;
}
this.displayEvoUser(id);
};
this.displayEvoUser = function (id) {
$("#" + id).empty();
var obj = self;
if (this instanceof MLS) obj = this;
obj.displayEvoLists(id, getUserLists());
};
this.displayEvoListSelector = function (div_id_sel, div_id_mls) {
this.displayEvoBasicListSelector(div_id_sel, div_id_mls, null);
};
this.displayBasicListSelector = function (div_id_sel, div_id_mls) {
this.displayEvoBasicListSelector(div_id_sel, null, div_id_mls);
};
this.displayEvoBasicListSelector = function (div_id_sel, div_id_evo, div_id_basic){
var res1 = this.getListsData();
var lists = res1.mailing_list;
var user_lists = [];
if (lists === undefined) return;
if (localStorage) {
if (localStorage.length
&& localStorage.getItem(getMLSId())) {
user_lists = JSON.parse(localStorage
.getItem(getMLSId()));
}
}
// TODO: Hack! Methods visible to HTML
Report.displayBasicUser = this.displayBasicUser;
Report.displayBasicUserAll = this.displayBasicUserAll;
Report.displayBasicDefault = this.displayBasicDefault;
Report.displayEvoDefault = this.displayEvoDefault;
Report.displayEvoUser = this.displayEvoUser;
Report.displayEvoUserAll = this.displayEvoUserAll;
var html = "Mailing list selector:";
html += "<form id='form_mls_selector'>";
if (typeof lists === 'string') {
lists = [ lists ];
}
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
html += '<input type=checkbox name="check_list" value="'
+ l + '" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUser(\''
+ div_id_evo + '\');';
if (div_id_basic)
html += 'Report.displayBasicUser(\''
+ div_id_basic + '\')";';
html += '" ';
html += 'id="' + l + '_check" ';
if ($.inArray(l, user_lists) > -1)
html += 'checked ';
html += '>';
html += MLS.displayMLSListName(l);
html += '<br>';
}
html += '<input type=button value="All" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUserAll(\'' + div_id_evo
+ '\',true);';
if (div_id_basic)
html += 'Report.displayBasicUserAll(\''
+ div_id_basic + '\',true);';
html += '">';
html += '<input type=button value="None" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoUserAll(\'' + div_id_evo
+ '\',false);';
if (div_id_basic)
html += 'Report.displayBasicUserAll(\''
+ div_id_basic + '\',false);';
html += '">';
html += '<input type=button value="Default" ';
html += 'onClick="';
if (div_id_evo)
html += 'Report.displayEvoDefault(\''+div_id_evo+'\');';
if (div_id_basic)
html += 'Report.displayBasicDefault(\''+div_id_basic+'\')';
html += '">';
html += "</form>";
$("#" + div_id_sel).html(html);
if (Report.getProjectsList().length>1) {
$("#" + div_id_sel).append("Not supported in multiproject");
$('#' + div_id_sel + ' :input').attr('disabled', true);
}
}
// history values should be always arrays
function filterHistory(history) {
if (typeof (history.id) === "number") {
$.each(history, function(key, value) {
value = [ value ];
});
}
return history;
}
this.displayEvoLists = function (id, lists) {
for ( var i = 0; i < lists.length; i++) {
var l = lists[i];
file_messages = this.getDataDir()+"/mls-";
file_messages += l;
file_messages += "-evolutionary.json";
this.displayEvoList(MLS.displayMLSListName(l), id, file_messages);
}
};
this.displayEvoList = function(list_label, id, mls_file) {
var self = this;
$.getJSON(mls_file, function(history) {
// TODO: Support multiproject
self.envisionEvoList(list_label, id, history);
});
};
this.envisionEvoList = function (list_label, div_id, history) {
var config = Report.getConfig();
var options = Viz.getEnvisionOptionsMin(div_id, history,
config.mls_hide);
options.data.list_label = MLS.displayMLSListName(list_label);
new envision.templates.Envision_Report(options, [ this ]);
};
}
var aux = new MLS();
MLS.prototype = new DataSource("mls", aux.getMetrics());

View File

@ -0,0 +1,997 @@
/*
* Copyright (C) 2012-2013 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
var Report = {};
(function() {
// Shared config
var project_data = null, markers = null, config = null,
gridster = {}, data_sources = [], html_dir="";
var data_dir = "data/json";
var default_data_dir = "data/json";
var default_html_dir = "";
var projects_dirs = [default_data_dir];
var projects_data = {};
var projects_datasources = {};
var repos_map = {};
var project_file = data_dir + "/project-info.json",
config_file = data_dir + "/viz_cfg.json",
markers_file = data_dir + "/markers.json",
repos_map_file = data_dir + "/repos-map.json";
// TODO: Why is it public? Markup API!
// Public API
Report.convertBasicDivs = convertBasicDivs;
Report.convertEnvision = convertEnvision;
Report.convertFlotr2 = convertFlotr2;
Report.convertTop = convertTop;
Report.convertBubbles = convertBubbles;
Report.convertDemographics = convertDemographics;
Report.convertSelectors = convertSelectors;
Report.createDataSources = createDataSources;
Report.getAllMetrics = getAllMetrics;
Report.getMarkers = getMarkers;
Report.getConfig = getConfig;
Report.getMetricDS = getMetricDS;
Report.getGridster = getGridster;
Report.setGridster = setGridster;
Report.getProjectData = getProjectData;
Report.getProjectsData = getProjectsData;
Report.getBasicDivs = function() {
return basic_divs;
};
Report.displayReportData = displayReportData;
Report.convertGlobal = convertGlobal;
Report.convertStudies = convertStudies;
Report.getDataSources = function() {
// return data_sources.slice(0,3);
return data_sources;
};
Report.registerDataSource = function(backend) {
data_sources.push(backend);
};
Report.setHtmlDir = function (dir) {
html_dir = dir;
};
Report.getDataDir = function() {
return data_dir;
};
Report.setDataDir = function(dataDir) {
data_dir = dataDir;
project_file = dataDir + "/project-info.json",
config_file = dataDir + "/viz_cfg.json",
markers_file = dataDir + "/markers.json";
repos_mapping_file = data_dir + "/repos-mapping.json";
};
function getMarkers() {
return markers;
}
Report.setMarkers = function (data) {
markers = data;
};
Report.getMarkersFile = function () {
return markers_file;
};
Report.getReposMap = function() {
return repos_map;
};
Report.setReposMap = function (data) {
repos_map = data;
};
Report.getReposMapFile = function () {
return repos_map_file;
};
Report.getValidRepo = function (repo, ds) {
var valid_repo = null;
var repos = ds.getReposGlobalData();
if (repos[repo]) return repo;
// Search for a mapping repository
$.each(Report.getReposMap(), function (repo_name, repo_map) {
if (repo_name === repo) {
var test_repo = repo_map;
if (repos[test_repo]!== undefined) {
valid_repo = test_repo;
return false;
}
} else if (repo_map === repo) {
var test_repo = repo_name;
if (repos[test_repo]!== undefined) {
valid_repo = test_repo;
return false;
}
}
});
return valid_repo;
};
function getConfig() {
return config;
}
Report.setConfig = function(cfg) {
config = cfg;
};
Report.getConfigFile = function() {
return config_file;
};
function getGridster() {
return gridster;
}
function setGridster(grid) {
gridster = grid;
}
function getProjectData() {
return project_data;
}
Report.setProjectData = function(data) {
project_data = data;
};
Report.getProjectFile = function () {
return project_file;
};
function getProjectsData() {
return projects_data;
}
Report.getProjectsDirs = function () {
return projects_dirs;
};
Report.setProjectsDirs = function (dirs) {
projects_dirs = dirs;
};
Report.getProjectsList = function () {
var projects_list = [];
for (key in getProjectsData()) {
projects_list.push(key);
}
return projects_list;
};
Report.getProjectsDataSources = function () {
return projects_datasources;
};
function getMetricDS(metric_id) {
var ds = [];
$.each(Report.getDataSources(), function(i, DS) {
if (DS.getMetrics()[metric_id]) {
ds.push(DS);
}
});
return ds;
}
function getAllMetrics() {
var all = {};
$.each(Report.getDataSources(), function(index, DS) {
all = $.extend({}, all, DS.getMetrics());
});
return all;
}
function displayReportData() {
data = project_data;
document.title = data.project_name + ' Report by Bitergia';
if (data.title) document.title = data.title;
$(".report_date").text(data.date);
$(".report_name").text(data.project_name);
str = data.blog_url;
if (str && str.length > 0) {
$('#blogEntry').html(
"<br><a href='" + str
+ "'>Blog post with some more details</a>");
$('.blog_url').attr("href", data.blog_url);
} else {
$('#more_info').hide();
}
str = data.producer;
if (str && str.length > 0) {
$('#producer').html(str);
} else {
$('#producer').html("<a href='http://bitergia.com'>Bitergia</a>");
}
$(".project_name").text(data.project_name);
$("#project_url").attr("href", data.project_url);
}
function checkDynamicConfig() {
var data_sources = [];
function getDataDirs(dirs_config) {
var full_params = dirs_config.split ("&");
var dirs_param = $.grep(full_params,function(item, index) {
return (item.indexOf("data_dir=") === 0);
});
for (var i=0; i< dirs_param.length; i++) {
var data_dir = dirs_param[i].split("=")[1];
data_sources.push(data_dir);
if (i === 0) Report.setDataDir(data_dir);
}
}
var querystr = window.location.search.substr(1);
// Config in GET URL
if (querystr && querystr.indexOf("data_dir")>=0) {
getDataDirs(querystr);
if (data_sources.length>0)
Report.setProjectsDirs(data_sources);
}
}
function createDataSources() {
checkDynamicConfig();
var projects_dirs = Report.getProjectsDirs();
$.each(projects_dirs, function (i, project) {
// TODO: Only DS with data should exist
var its = new ITS();
Report.registerDataSource(its);
var mls = new MLS();
Report.registerDataSource(mls);
var scm = new SCM();
Report.registerDataSource(scm);
its.setDataDir(project);
mls.setDataDir(project);
scm.setDataDir(project);
scm.setITS(its);
});
return true;
}
var basic_divs = {
"navigation": {
convert: function() {
$.get(html_dir+"navigation.html", function(navigation) {
$("#navigation").html(navigation);
var querystr = window.location.search.substr(1);
if (querystr && querystr.indexOf("data_dir")!==-1) {
var $links = $("#navigation a");
$.each($links, function(index, value){
value.href += "?"+window.location.search.substr(1);
});
}
});
}
},
"header": {
convert: function() {
$.get(html_dir+"header.html", function(header) {
$("#header").html(header);
displayReportData();
var div_companies_links = "companies_links";
if ($("#"+div_companies_links).length > 0) {
var limit = $("#"+div_companies_links).data('limit');
var order_by = $("#"+div_companies_links).data('order-by');
var DS = null;
// scm support only
$.each(data_sources, function(i, ds) {
if (ds.getName() === "scm") {DS = ds; return false;}
});
DS.displayCompaniesLinks(div_companies_links, limit, order_by);
}
var querystr = window.location.search.substr(1);
if (querystr && querystr.indexOf("data_dir")!==-1) {
var $links = $("#header a");
$.each($links, function(index, value){
value.href += "?"+window.location.search.substr(1);
});
}
});
}
},
"footer": {
convert: function() {
$.get(html_dir+"footer.html", function(footer) {
$("#footer").html(footer);
});
}
},
"activity": {
convert: function() {
var html = "<h1>Last Week</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_7";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activity").html(html);
}
},
"activitymonth": {
convert: function() {
var html = "<h1>Last Month</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_30";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activitymonth").html(html);
}
},
"activityquarter": {
convert: function() {
var html = "<h1>Last Quarter</h1>";
$.each(Report.getDataSources(), function(index, DS) {
var data = DS.getGlobalData();
for (key in data) {
// 7, 30, 90, 365
var suffix = "_90";
if (key.indexOf(suffix, key.length - suffix.length) !== -1) {
var metric = key.substring(0, key.length - suffix.length);
html += metric + ":" + data[key] + "<br>";
}
};
});
$("#activityquarter").html(html);
}
},
// Reference card with info from all data sources
"refcard": {
convert: function() {
$.when($.get(html_dir+"refcard.html"),
$.get(html_dir+"project-card.html"))
.done (function(res1, res2) {
refcard = res1[0];
projcard = res2[0];
$("#refcard").html(refcard);
displayReportData();
$.each(getProjectsData(), function(prj_name, prj_data) {
var new_div = "card-"+prj_name.replace(".","").replace(" ","");
$("#refcard #projects_info").append(projcard);
$("#refcard #projects_info #new_card")
.attr("id", new_div);
$.each(data_sources, function(i, DS) {
if (DS.getProject() !== prj_name) {
$("#" + new_div + ' .'+DS.getName()+'-info').hide();
return;
}
DS.displayData(new_div);
});
$("#"+new_div+" #project_name").text(prj_name);
if (projects_dirs.length>1)
$("#"+new_div+" .project_info")
.append(' <a href="VizGrimoireJS/browser/index.html?data_dir=../../'+prj_data.dir+'">Report</a>');
$("#"+new_div+" #project_url")
.attr("href", prj_data.url);
});
});
}
},
"radar-activity": {
convert: function() {
Viz.displayRadarActivity('radar-activity');
}
},
"radar-community": {
convert: function() {
Viz.displayRadarCommunity('radar-community');
}
},
"gridster": {
convert: function() {
var gridster = $("#gridster").gridster({
widget_margins : [ 10, 10 ],
widget_base_dimensions : [ 140, 140 ]
}).data('gridster');
Report.setGridster(gridster);
gridster.add_widget("<div id='metric_selector'></div>", 1, 3);
Viz.displayGridMetricSelector('metric_selector');
Viz.displayGridMetricAll(true);
}
},
"treemap": {
convert: function() {
var file = $('#treemap').data('file');
Viz.displayTreeMap('treemap', file);
}
}
};
function convertCompanies(config) {
// General config for metrics viz
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
if (config) {
$.each(config, function(key, value) {
config_metric[key] = value;
});
}
var company = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "company")
company = querystr.split("&")[0].split("=")[1];
company = decodeURIComponent(company);
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-companies-summary";
if ($("#"+divid).length > 0) {
DS.displayCompaniesSummary(divid, this);
}
var divid = DS.getName()+"-refcard-company";
if ($("#"+divid).length > 0) {
DS.displayCompanySummary(divid, company, this);
}
var div_companies = DS.getName()+"-flotr2-companies";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var order_by = $(this).data('order-by');
var stacked = false;
if ($(this).data('stacked')) stacked = true;
config_metric.lines = {stacked : stacked};
div.id = metric+"-flotr2-companies";
DS.displayBasicMetricCompanies(metric,div.id,
config_metric, limit, order_by);
});
}
var div_companies = DS.getName()+"-flotr2-companies-static";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var order_by = $(this).data('order-by');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-companies-static";
DS.displayBasicMetricCompaniesStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_company = DS.getName()+"-flotr2-metrics-company";
var divs = $("."+div_company);
if (divs.length > 0 && company) {
$.each(divs, function(id, div) {
config_metric.show_legend = false;
var metrics = $(this).data('metrics');
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-company";
DS.displayBasicMetricsCompany(company, metrics.split(","),
div.id, config_metric);
});
}
var div_nav = DS.getName()+"-flotr2-companies-nav";
if ($("#"+div_nav).length > 0) {
var metric = $("#"+div_nav).data('sort-metric');
DS.displayCompaniesNav(div_nav, metric);
}
var divs_comp_list = DS.getName()+"-flotr2-companies-list";
var divs = $("."+divs_comp_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var sort_metric = $(this).data('sort-metric');
div.id = metrics.replace(/,/g,"-")+"-flotr2-companies-list";
DS.displayCompaniesList(metrics.split(","),div.id,
config_metric, sort_metric);
});
}
var div_companies = DS.getName()+"-flotr2-top-company";
var divs = $("."+div_companies);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var period = $(this).data('period');
var titles = $(this).data('titles');
div.id = metric+"-"+period+"-flotr2-top-company";
div.className = "";
DS.displayTopCompany(company,div.id,metric,period,titles);
});
}
});
}
function convertCountries() {
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
var country = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "country")
country = decodeURIComponent(querystr.split("&")[0].split("=")[1]);
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-countries-summary";
if ($("#"+divid).length > 0) {
DS.displayCountriesSummary(divid, this);
}
var div_countries = DS.getName()+"-flotr2-countries-static";
var divs = $("."+div_countries);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
var order_by = $(this).data('order-by');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-countries-static";
DS.displayBasicMetricCountriesStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_nav = DS.getName()+"-flotr2-countries-nav";
if ($("#"+div_nav).length > 0) {
var order_by = $("#"+div_nav).data('order-by');
DS.displayCountriesNav(div_nav, order_by);
}
var divs_countries_list = DS.getName()+"-flotr2-countries-list";
var divs = $("."+divs_countries_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var order_by = $(this).data('order-by');
div.id = metrics.replace(/,/g,"-")+"-flotr2-countries-list";
DS.displayCountriesList(metrics.split(","),div.id,
config_metric, order_by);
});
}
if (country !== null) {
var divid = DS.getName()+"-refcard-country";
if ($("#"+divid).length > 0) {
DS.displayCountrySummary(divid, country, this);
}
var div_country = DS.getName()+"-flotr2-metrics-country";
var divs = $("."+div_country);
if (divs.length) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-country";
DS.displayBasicMetricsCountry(country, metrics.split(","),
div.id, config_metric);
});
}
}
});
}
function convertRepos() {
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
var repo = null, repo_valid = null;
var querystr = window.location.search.substr(1);
if (querystr &&
querystr.split("&")[0].split("=")[0] === "repository") {
repo = decodeURIComponent(querystr.split("&")[0].split("=")[1]);
}
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-repos-summary";
if ($("#"+divid).length > 0) {
DS.displayReposSummary(divid, this);
}
var div_repos = DS.getName()+"-flotr2-repos-static";
var divs = $("."+div_repos);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var limit = $(this).data('limit');
var show_others = $(this).data('show-others');
var order_by = $(this).data('order-by');
config_metric.graph = $(this).data('graph');
div.id = metric+"-flotr2-repos-static";
DS.displayBasicMetricReposStatic(metric,div.id,
config_metric, limit, order_by, show_others);
});
}
var div_nav = DS.getName()+"-flotr2-repos-nav";
if ($("#"+div_nav).length > 0) {
var order_by = $("#"+div_nav).data('order-by');
var scm_and_its = $("#"+div_nav).data('scm-and-its');
DS.displayReposNav(div_nav, order_by, scm_and_its);
}
var divs_repos_list = DS.getName()+"-flotr2-repos-list";
var divs = $("."+divs_repos_list);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
var order_by = $(this).data('order-by');
var scm_and_its = $(this).data('scm-and-its');
div.id = metrics.replace(/,/g,"-")+"-flotr2-repos-list";
DS.displayReposList(metrics.split(","),div.id,
config_metric, order_by, scm_and_its);
});
}
if (repo !== null) repo_valid = Report.getValidRepo(repo, DS);
if (repo_valid !== null) {
var divid = DS.getName()+"-refcard-repo";
if ($("#"+divid).length > 0) {
DS.displayRepoSummary(divid, repo_valid, this);
}
var div_repo = DS.getName()+"-flotr2-metrics-repo";
var divs = $("."+div_repo);
if (divs.length) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend')) config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics-repo";
DS.displayBasicMetricsRepo(repo_valid, metrics.split(","),
div.id, config_metric);
});
}
}
});
}
function convertFlotr2(config) {
// General config for metrics viz
var config_metric = {};
config_metric.show_desc = false;
config_metric.show_title = false;
config_metric.show_labels = true;
if (config) {
$.each(config, function(key, value) {
config_metric[key] = value;
});
}
var already_shown = [];
var metric_already_shown = [];
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
$.each(DS.getMetrics(), function(i, metric) {
var div_flotr2 = metric.divid+"-flotr2";
if ($("#"+div_flotr2).length > 0 &&
$.inArray(metric.column, metric_already_shown) === -1) {
DS.displayBasicMetricHTML(i,div_flotr2, config_metric);
metric_already_shown.push(metric.column);
}
// Getting data real time
var div_flotr2_rt = metric.divid+"-flotr2-rt";
var divs = $("."+div_flotr2_rt);
if (divs.length > 0) {
$.each(divs, function(id, div) {
config_metric.realtime = true;
// config_metric.json_ds = "http://localhost:1337/?callback=?";
var db = "acs_cvsanaly_allura_1049";
db = $(this).data('db');
div.id = db + "_" + div.className;
config_metric.json_ds ="http://localhost:3000/scm/"+db+"/";
config_metric.json_ds += metric.column+"_evol/?callback=?";
DS.displayBasicMetricHTML(i,div.id, config_metric);
});
}
});
if ($("#"+DS.getName()+"-flotr2").length > 0) {
if ($.inArray(DS.getName(), already_shown) === -1) {
DS.displayBasicHTML(DS.getName()+'-flotr2', config_metric);
already_shown.push(DS.getName());
}
}
if (DS instanceof MLS) {
if ($("#"+DS.getName()+"-flotr2"+"-lists").length > 0) {
if (Report.getProjectsList().length === 1)
DS.displayBasic
(DS.getName() + "-flotr2"+"-lists", config_metric);
}
}
// Multiparam
var div_param = DS.getName()+"-flotr2-metrics";
var divs = $("."+div_param);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metrics = $(this).data('metrics');
config.show_legend = false;
if ($(this).data('legend'))
config_metric.show_legend = true;
div.id = metrics.replace(/,/g,"-")+"-flotr2-metrics";
DS.displayBasicMetrics(metrics.split(","),div.id,
config_metric);
});
}
// Time to fix
var div_ttfix = DS.getName()+"-time-to-fix";
divs = $("."+div_ttfix);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var quantil = 'X'+$(this).data('quantil');
div.id = DS.getName()+"-time-to-fix-"+quantil;
DS.displayTimeToFix(div.id, quantil);
});
}
// Time to attention
var div_ttatt = DS.getName()+"-time-to-attention";
divs = $("."+div_ttatt);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var quantil = 'X'+$(this).data('quantil');
div.id = DS.getName()+"-time-to-attention-"+quantil;
DS.displayTimeToAttention(div.id, quantil);
});
}
});
}
function convertEnvision() {
if ($("#all-envision").length > 0) {
var relative = $('#all-envision').data('relative');
Viz.displayEvoSummary('all-envision', relative);
}
var already_shown = [];
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_envision = DS.getName() + "-envision";
if ($("#" + div_envision).length > 0) {
if ($.inArray(DS.getName(), already_shown) !== -1)
return;
var relative = $('#'+div_envision).data('relative');
if (DS instanceof MLS) {
DS.displayEvo(div_envision, relative);
// DS.displayEvoAggregated(div_envision);
if (Report.getProjectsList().length === 1)
if ($("#" + DS.getName() + "-envision"+"-lists").length > 0)
DS.displayEvoListsMain
(DS.getName() + "-envision"+"-lists");
} else if ($.inArray(DS.getName(), already_shown) === -1) {
DS.displayEvo(div_envision, relative);
}
already_shown.push(DS.getName());
}
});
}
function convertIdentity() {
$.each(Report.getDataSources(), function(index, DS) {
var divid = DS.getName()+"-people";
if ($("#"+divid).length > 0) {
Identity.showList(divid, DS);
}
});
if ($("#unique-people").length > 0)
Identity.showListNested("unique-people");
}
function convertTop() {
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_id_top = DS.getName()+"-top";
var show_all = false;
if ($("#"+div_id_top).length > 0) {
if ($("#"+div_id_top).data('show_all')) show_all = true;
var top_metric = $("#"+div_id_top).data('metric');
DS.displayTop(div_id_top, show_all, top_metric);
}
$.each(['pie','bars'], function (index, chart) {
var div_id_top = DS.getName()+"-top-"+chart;
if ($("#"+div_id_top).length > 0) {
if ($("#"+div_id_top).data('show_all')) show_all = true;
var show_metric = $("#"+div_id_top).data('metric');
DS.displayTop(div_id_top, show_all, show_metric, chart);
}
div_id_top = DS.getName()+"-top-basic-"+chart;
if ($("#"+div_id_top).length > 0) {
var doer = $("#"+div_id_top).data('doer');
var action = $("#"+div_id_top).data('action');
DS.displayTopBasic(div_id_top, action, doer, chart);
}
});
var div_tops = DS.getName()+"-global-top-metric";
var divs = $("."+div_tops);
if (divs.length > 0) {
$.each(divs, function(id, div) {
var metric = $(this).data('metric');
var period = $(this).data('period');
var titles = $(this).data('titles');
div.id = metric.replace("_","-")+"-"+period+"-global-metric";
DS.displayTopGlobal(div.id, metric, period, titles);
});
}
});
}
function convertBubbles() {
$.each(Report.getDataSources(), function(index, DS) {
if (DS.getData().length === 0) return;
var div_time = DS.getName() + "-time-bubbles";
if ($("#" + div_time).length > 0) {
var radius = $("#" + div_time).data('radius');
DS.displayBubbles(div_time, radius);
}
});
}
function convertDemographics() {
$.each(Report.getDataSources(), function(index, DS) {
var div_demog = DS.getName() + "-demographics";
if ($("#" + div_demog).length > 0)
DS.displayDemographics(div_demog);
// Specific demographics loaded from files
var divs = $('[id^="' + DS.getName() + '-demographics"]');
for ( var i = 0; i < divs.length; i++) {
var file = $(divs[i]).data('file');
// period in years
var period = $(divs[i]).data('period');
DS.displayDemographics(divs[i].id, file, period);
}
});
}
function convertSelectors() {
// Selectors
$.each(Report.getDataSources(), function(index, DS) {
var div_selector = DS.getName() + "-selector";
var div_envision = DS.getName() + "-envision-lists";
var div_flotr2 = DS.getName() + "-flotr2-lists";
if ($("#" + div_selector).length > 0)
// TODO: Only MLS supported
if (DS instanceof MLS) {
DS.displayEvoBasicListSelector(div_selector, div_envision,
div_flotr2);
}
});
}
function convertBasicDivs() {
$.each (basic_divs, function(divid, value) {
if ($("#"+divid).length > 0) value.convert();
});
}
function configDataSources() {
var prjs_dss = Report.getProjectsDataSources();
$.each(Report.getDataSources(), function (index, ds) {
if (ds.getData() instanceof Array) return;
$.each(projects_data, function (name, project) {
if (project.dir === ds.getDataDir()) {
if (prjs_dss[name] === undefined) prjs_dss[name] = [];
ds.setProject(name);
prjs_dss[name].push(ds);
return false;
}
});
});
}
Report.setReportConfig = function (data) {
if (data) {
if (data['global-html-dir'])
Report.setHtmlDir(data['global-html-dir']);
if (data['global-data-dir'])
Report.setDataDir(data['global-data-dir']);
if (data['projects-data-dirs'])
Report.setProjectsDirs(data['projects-data-dirs']);
}
};
function convertGlobal() {
configDataSources();
convertBasicDivs();
convertBubbles();
convertEnvision();
convertFlotr2(config);
convertTop();
}
function convertStudies() {
convertRepos();
convertCompanies();
convertCountries();
convertDemographics();
convertSelectors();
}
// TODO: Move to plugins
function convertOthers() {
// TODO: Create a new class for Identity?
convertIdentity();
}
})();
Loader.data_ready_global(function() {
Report.convertGlobal();
});
Loader.data_ready(function() {
Report.convertStudies();
$("body").css("cursor", "auto");
});
$(document).ready(function() {
$.getJSON('config.json', function(data) {
Report.setReportConfig(data);
}).always(function (data) {
Report.createDataSources();
Loader.data_load();
$("body").css("cursor", "progress");
});
});

View File

@ -0,0 +1,234 @@
/*
* Copyright (C) 2012 Bitergia
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* This file is a part of the VizGrimoireJS package
*
* Authors:
* Alvaro del Castillo San Felix <acs@bitergia.com>
*/
function SCM() {
var basic_metrics = {
'commits' : {
'divid' : "scm-commits",
'column' : "commits",
'name' : "Commits",
'desc' : "Evolution of the number of commits (aggregating branches)",
'envision' : {
y_labels : true,
show_markers : true
}
},
'committers' : {
'divid' : "scm-committers",
'column' : "committers",
'name' : "Committers",
'desc' : "Unique committers making changes to the source code",
'action' : "commits",
'envision' : {
gtype : 'whiskers'
}
},
'authors' : {
'divid' : "scm-authors",
'column' : "authors",
'name' : "Authors",
'desc' : "Unique authors making changes to the source code",
'action' : "commits",
'envision' : {
gtype : 'whiskers'
}
},
'authors_rev' : {
'divid' : "scm-authors-rev",
'column' : "authors_rev",
'name' : "Authors",
'desc' : "Unique authors making changes reviewed to the source code",
'action' : "commits_rev",
'envision' : {
gtype : 'whiskers'
}
},
'commits_rev' : {
'divid' : "scm-commits-rev",
'column' : "commits_rev",
'name' : "Commits Reviewed",
'desc' : "Evolution of the number of commits reviewed (aggregating branches)",
'envision' : {
y_labels : true,
show_markers : true
}
},
'reviewers' : {
'divid' : "scm-reviewers",
'column' : "reviewers",
'name' : "Reviewers",
'desc' : "Unique reviewers making reviews to the source code changes",
'action' : "commits-rev",
'envision' : {
gtype : 'whiskers'
}
},
'branches' : {
'divid' : "scm-branches",
'column' : "branches",
'name' : "Branches",
'desc' : "Evolution of the number of branches"
},
'files' : {
'divid' : "scm-files",
'column' : "files",
'name' : "Files",
'desc' : "Evolution of the number of unique files handled by the community"
},
'files' : {
'divid' : "scm-files",
'column' : "files",
'name' : "Files",
'desc' : "Evolution of the number of unique files handled by the community"
},
'added_lines' : {
'divid' : "scm-added-lines",
'column' : "added_lines",
'name' : "Lines Added",
'desc' : "Evolution of the source code lines added"
},
'removed_lines' : {
'divid' : "scm-removed-lines-",
'column' : "removed_lines",
'name' : "Lines Removed",
'desc' : "Evolution of the source code lines removed"
},
'repositories' : {
'divid' : "scm-repositories",
'column' : "repositories",
'name' : "Repositories",
'desc' : "Evolution of the number of repositories",
'envision' : {
gtype : 'whiskers'
}
}
};
this.getMetrics = function() {return basic_metrics;};
this.getMainMetric = function() {
return "commits";
};
this.setITS = function(its) {
this.its = its;
};
this.getITS = function(its) {
return this.its;
};
this.getTitle = function() {return "Change sets (commits to source code)";};
this.displaySubReportSummary = function(report, divid, item, ds) {
var label = item;
if (item.lastIndexOf("http") === 0) {
var aux = item.split("_");
label = aux.pop();
if (label === '') label = aux.pop();
}
var html = "<h1>"+label+"</h1>";
var id_label = {
commits:'Commits',
committers:'Committers',
authors:'Authors',
first_date:'Start',
last_date:'End',
files:'Files',
actions:'Files actions',
avg_commits_month:'Commits/month',
avg_files_month:'Files/month',
avg_authors_month:'Authors/month',
avg_reviewers_month:'Reviewers/moth',
avg_commits_week:'Commits/week',
avg_files_week:'Files/week',
avg_authors_week:'Authors/week',
avg_reviewers_week:'Reviewers/week',
avg_commits_author:'Commits/author',
avg_files_author:'Files/author'
};
var global_data = null;
if (report === "companies")
global_data = ds.getCompaniesGlobalData();
else if (report === "repositories")
global_data = ds.getReposGlobalData();
else if (report === "countries")
global_data = ds.getCountriesGlobalData();
else return;
if (!global_data[item]) return;
$.each(global_data[item],function(id,value) {
if (id_label[id])
html += id_label[id] + ": " + value + "<br>";
else
html += id + ": " + value + "<br>";
});
$("#"+divid).append(html);
};
this.displayData = function(divid) {
var div_id = "#" + divid;
var str = this.global_data.url;
if (!str || str.length === 0) {
$(div_id + ' .scm-info').hide();
return;
}
$(div_id + ' #scm_type').text(this.global_data.type);
var url = '';
if (this.global_data.repositories === 1) {
url = this.global_data.url;
} else {
url = Report.getProjectData().scm_url;
}
if (this.global_data.type === "git")
if (url) url = url.replace("git://","http://");
$(div_id + ' #scm_url').attr("href", url);
$(div_id + ' #scm_name').text(this.global_data.type);
var company = this.getCompanyQuery();
var data = this.getGlobalData();
if (company) {
data = this.getCompaniesGlobalData()[company];
}
$(div_id + ' #scmFirst').text(data.first_date);
$(div_id + ' #scmLast').text(data.last_date);
$(div_id + ' #scmCommits').text(data.commits);
$(div_id + ' #scmAuthors').text(data.authors);
if (data.reviewers)
$(div_id + ' #scmReviewers').text(data.reviewers);
$(div_id + ' #scmCommitters').text(data.committers);
$(div_id + ' #scmRepositories').text(data.repositories);
if (data.repositories === 1)
$(div_id + ' #scmRepositories').hide();
};
this.displayBubbles = function(divid, radius) {
Viz.displayBubbles(divid, "commits", "committers", radius);
};
}
var aux = new SCM();
SCM.prototype = new DataSource("scm", aux.getMetrics());

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.flotr-handles-handle{background:#eee;border:1px solid #333;position:absolute;cursor:pointer;border-radius:3px}.flotr-handles-handle,.flotr-grid-label{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.flotr-handles-drag{height:12px;width:6px}.flotr-handles-scroll{height:6px;cursor:move}.flotr-handles-left{cursor:w-resize}.flotr-handles-right{cursor:e-resize}.envision-finance{width:600px}.envision-finance-price .envision-component{height:200px}.envision-finance-volume .envision-component{height:60px}.envision-finance-connection .envision-component{height:16px}.envision-finance-summary .envision-component{cursor:all-scroll;height:70px;margin-top:-2px}.envision-finance-price,.envision-finance-volume{border:1px solid #B6D9FF;background:#fff}.envision-finance-price{border-top-right-radius:5px;border-top-left-radius:5px}.envision-finance-volume{border-top:0}.envision-finance-connection canvas{z-index:10;background:#fff}.envision-finance-connection canvas object{position:absolute;top:0}.envision-finance-price .flotr-grid-label{margin-left:4px}.envision-finance-price .flotr-grid-label.first{margin-top:-6px}.envision-finance-price .flotr-grid-label.last{margin-top:6px}.envision-finance-summary .flotr-grid-label{margin-top:3px}.envision-finance-price .flotr-mouse-value{font-size:12px}.envision-finance-volume .flotr-mouse-value{display:none}@media screen and (max-width:600px){.envision-finance{width:100%}.envision-finance-price .envision-component{height:120px}.envision-finance-summary .envision-component,.envision-finance-volume .envision-component{height:40px}}.envision-timeseries{width:auto}.envision-timeseries-detail .envision-component{height:200px}.envision-timeseries-connection .envision-component{height:16px}.envision-timeseries-summary .envision-component{cursor:all-scroll;height:80px}.envision-timeseries-detail{padding-top:7px;border:1px solid #B6D9FF;border-top-right-radius:5px;border-top-left-radius:5px;border-bottom:0;background:#e2f0ff}.envision-timeseries-connection canvas{z-index:10;background:#fff}.envision-timeseries-connection canvas object{position:absolute;top:0}.envision-timeseries-summary .envision-component{margin-top:-2px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
/*! gridster.js - v0.1.0 - 2012-10-20
* http://gridster.net/
* Copyright (c) 2012 ducksboard; Licensed MIT */
.gridster {
position:relative;
}
.gridster > * {
margin: 0 auto;
-webkit-transition: height .4s;
-moz-transition: height .4s;
-o-transition: height .4s;
-ms-transition: height .4s;
transition: height .4s;
}
.gridster .gs_w{
z-index: 2;
position: absolute;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s;
-moz-transition: opacity .3s, left .3s, top .3s;
-o-transition: opacity .3s, left .3s, top .3s;
transition: opacity .3s, left .3s, top .3s;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-moz-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-o-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
}
.gridster .preview-holder {
z-index: 1;
position: absolute;
background-color: #fff;
border-color: #fff;
opacity: 0.3;
}
.gridster .player-revert {
z-index: 10!important;
-webkit-transition: left .3s, top .3s!important;
-moz-transition: left .3s, top .3s!important;
-o-transition: left .3s, top .3s!important;
transition: left .3s, top .3s!important;
}
.gridster .dragging {
z-index: 10!important;
-webkit-transition: all 0s !important;
-moz-transition: all 0s !important;
-o-transition: all 0s !important;
transition: all 0s !important;
}
/* Uncomment this if you set helper : "clone" in draggable options */
/*.gridster .player {
opacity:0;
}*/

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,74 @@
/* Shared CSS Style in all Envision Bitergia Reports */
.envision-component-container {
width: 325px;
height : 50px;
}
.envision-component-container.envision-first {
width: 325px;
height : 200px;
}
.envision-component {
width: 100%;
height: 100%;
}
.report-connection.envision-component-container {
height: 20px;
}
.report-summary.envision-component-container {
cursor: all-scroll;
height : 50px;
margin-top: -2px;
}
/* .milestone0-scm-committers {
border-top: 0px;
}
*/
/* Connection overlay */
.milestone0-connection .canvas {
z-index: 10;
background: #fff;
}
.milestone0-connection .canvas .object {
position: absolute;
top: 0px;
}
/* X-Axis Labels */
.milestone0-summary .flotr-grid-label {
margin-top: 5px;
}
/* Mouse Tracker */
.envision-component-container.envision-first .flotr-mouse-value {
font-size: 12px;
display:inline;
}
.envision-component-container .flotr-mouse-value
{
display: none;
}
/* @media screen and (max-width: 600px) {
.milestone0-scm-commits {
width: 100%;
}
.milestone0-scm-commits .envision-component
{
height: 120px;
}
.milestone0-scm-summary .envision-component,
.milestone0-scm-committers .envision-component {
height: 40px;
}
} */

View File

@ -0,0 +1,272 @@
/* Auto resize the image to fit with no scrolls */
img {
max-width: 100%;
height: auto;
width: auto\9; /* ie8 */
}
body {
margin: 0;
padding: 0;
/* background: #FFA500; */
font: normal 0.75em georgia, sans-serif;
}
/*
LAYOUT: We need to simplify it
*/
#wrapper {
margin: 0% 2%;
width: 95%;
float: center;
}
#header {
overflow: auto;
position: relative;
margin: 5px 0 0 0;
}
.ie6 #header {
width: 100%;
}
.column-right {
width: 450px;
margin: 8px auto;
float: right;
}
.left {
float: left;
}
.column {
margin-left: 8px;
margin-right: 8px;
}
#info-column1{
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column2{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column3{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column4{
float: left;
width: 325px;
margin-bottom: 40px;
}
.info-pill {
-moz-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-webkit-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
#footer {
overflow: hidden;
clear: both;
padding: 10px 0;
border-top: 1px dashed #000;
}
#companies-column1 {
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 40px;
}
#companies-column2 {
float: right;
width: 650px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column1 {
float: left;
width: 150px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column2 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column3 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
/*
FOOTER COMPONENTS
*/
#footer p, #footer dl {
margin: 0;
font-size: 88%;
line-height: 1.2;
}
/*
TEXT
*/
h1 {
margin-bottom: .25em;
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 100%;
/* text-shadow: -1px -1px 1px hsla(0,0%,100%,.6);
letter-spacing: -1px; */
color: #ffa500;
}
h1, h2, h3 {
font-weight: bold;
line-height: 1.2;
}
h2, h3 {
margin-bottom: 0;
color: #555;
}
h2 {
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 115%;
/* text-shadow: -1px -1px 0 hsla(0,0%,100%,.6);
letter-spacing: -1px; */
}
h3 {
font-family: Cambria, "Palatino Linotype", "Book Antiqua", Palatino, serif;
font-size: 105%;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Boxes for flotr2 */
.m0-box-div {
height: 130px;
}
.m0-box {
width: 180px;
height: 100px;
float: right;
margin-right: 5px;
margin-left: 5px;
}
/* Specific layout for some vizs */
/*
MLS
*/
.mls-dyn-list {
float: left;
margin-left: 8px;
margin-right: 8px;
width: 380px;
}
#mls-envision .envision-component-container.envision-first {
width: 500px;
}
#mls-envision .envision-component-container {
width: 500px;
}
#mls-envision-lists .envision-component-container.envision-first {
width: 325px;
height : 150px;
}
#mls-envision-lists .report-summary .envision-component {
cursor: all-scroll;
height : 30px;
margin-top: -2px;
/* align envision and flotr2 graphs*/
margin-bottom: 200px;
}
/*
OTHER STYLES FOR SPECIFIC CHARTS
*/
.graph .flotr-grid-label {
font-size: 0.6em
}
.graph {
height:200px;
width:200px;
}
.bubbles {
height:300px;
width:600px;
}
.radar {
height:400px;
width:500px;
}
.demographics {
height:400px;
width:400px;
}
.treemap {
position: relative;
width: 700px;
height: 500px;
}
.treemap-node {
border: solid 1px white;
font: 10px sans-serif;
line-height: 12px;
overflow: hidden;
position: absolute;
text-indent: 2px;
}
.basic-metric-html {height:100px;}
.subreport-list {height:120px;}
.subreport-list-item {float:right;height:100px;width:40%;}

View File

@ -0,0 +1 @@
rsync --existing -avP ../VizGrimoireJS.link/* .

View File

@ -0,0 +1,409 @@
.flotr-handles-handle{background:#eee;border:1px solid #333;position:absolute;cursor:pointer;border-radius:3px}.flotr-handles-handle,.flotr-grid-label{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.flotr-handles-drag{height:12px;width:6px}.flotr-handles-scroll{height:6px;cursor:move}.flotr-handles-left{cursor:w-resize}.flotr-handles-right{cursor:e-resize}.envision-finance{width:600px}.envision-finance-price .envision-component{height:200px}.envision-finance-volume .envision-component{height:60px}.envision-finance-connection .envision-component{height:16px}.envision-finance-summary .envision-component{cursor:all-scroll;height:70px;margin-top:-2px}.envision-finance-price,.envision-finance-volume{border:1px solid #B6D9FF;background:#fff}.envision-finance-price{border-top-right-radius:5px;border-top-left-radius:5px}.envision-finance-volume{border-top:0}.envision-finance-connection canvas{z-index:10;background:#fff}.envision-finance-connection canvas object{position:absolute;top:0}.envision-finance-price .flotr-grid-label{margin-left:4px}.envision-finance-price .flotr-grid-label.first{margin-top:-6px}.envision-finance-price .flotr-grid-label.last{margin-top:6px}.envision-finance-summary .flotr-grid-label{margin-top:3px}.envision-finance-price .flotr-mouse-value{font-size:12px}.envision-finance-volume .flotr-mouse-value{display:none}@media screen and (max-width:600px){.envision-finance{width:100%}.envision-finance-price .envision-component{height:120px}.envision-finance-summary .envision-component,.envision-finance-volume .envision-component{height:40px}}.envision-timeseries{width:auto}.envision-timeseries-detail .envision-component{height:200px}.envision-timeseries-connection .envision-component{height:16px}.envision-timeseries-summary .envision-component{cursor:all-scroll;height:80px}.envision-timeseries-detail{padding-top:7px;border:1px solid #B6D9FF;border-top-right-radius:5px;border-top-left-radius:5px;border-bottom:0;background:#e2f0ff}.envision-timeseries-connection canvas{z-index:10;background:#fff}.envision-timeseries-connection canvas object{position:absolute;top:0}.envision-timeseries-summary .envision-component{margin-top:-2px}/*! gridster.js - v0.1.0 - 2012-10-20
* http://gridster.net/
* Copyright (c) 2012 ducksboard; Licensed MIT */
.gridster {
position:relative;
}
.gridster > * {
margin: 0 auto;
-webkit-transition: height .4s;
-moz-transition: height .4s;
-o-transition: height .4s;
-ms-transition: height .4s;
transition: height .4s;
}
.gridster .gs_w{
z-index: 2;
position: absolute;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s;
-moz-transition: opacity .3s, left .3s, top .3s;
-o-transition: opacity .3s, left .3s, top .3s;
transition: opacity .3s, left .3s, top .3s;
}
.ready .gs_w:not(.preview-holder) {
-webkit-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-moz-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
-o-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
}
.gridster .preview-holder {
z-index: 1;
position: absolute;
background-color: #fff;
border-color: #fff;
opacity: 0.3;
}
.gridster .player-revert {
z-index: 10!important;
-webkit-transition: left .3s, top .3s!important;
-moz-transition: left .3s, top .3s!important;
-o-transition: left .3s, top .3s!important;
transition: left .3s, top .3s!important;
}
.gridster .dragging {
z-index: 10!important;
-webkit-transition: all 0s !important;
-moz-transition: all 0s !important;
-o-transition: all 0s !important;
transition: all 0s !important;
}
/* Uncomment this if you set helper : "clone" in draggable options */
/*.gridster .player {
opacity:0;
}*/
/* Auto resize the image to fit with no scrolls */
img {
max-width: 100%;
height: auto;
width: auto\9; /* ie8 */
}
body {
margin: 0;
padding: 0;
/* background: #FFA500; */
font: normal 0.75em georgia, sans-serif;
}
/*
LAYOUT: We need to simplify it
*/
#wrapper {
margin: 0% 2%;
width: 95%;
float: center;
}
#header {
overflow: auto;
position: relative;
margin: 5px 0 0 0;
}
.ie6 #header {
width: 100%;
}
.column-right {
width: 450px;
margin: 8px auto;
float: right;
}
.left {
float: left;
}
.column {
margin-left: 8px;
margin-right: 8px;
}
#info-column1{
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column2{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column3{
float: left;
width: 325px;
margin-bottom: 40px;
margin-right: 20px;
}
#info-column4{
float: left;
width: 325px;
margin-bottom: 40px;
}
.info-pill {
-moz-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-webkit-box-shadow: 0 0 8px hsla(0,0%,0%,.1);
box-shadow: 0 0 8px hsla(0,0%,0%,.1);
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
#footer {
overflow: hidden;
clear: both;
padding: 10px 0;
border-top: 1px dashed #000;
}
#companies-column1 {
float: left;
width: 250px;
margin-bottom: 40px;
margin-right: 40px;
}
#companies-column2 {
float: right;
width: 650px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column1 {
float: left;
width: 150px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column2 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
#company-column3 {
float: right;
width: 360px;
margin-bottom: 40px;
margin-right: 40px;
}
/*
FOOTER COMPONENTS
*/
#footer p, #footer dl {
margin: 0;
font-size: 88%;
line-height: 1.2;
}
/*
TEXT
*/
h1 {
margin-bottom: .25em;
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 100%;
/* text-shadow: -1px -1px 1px hsla(0,0%,100%,.6);
letter-spacing: -1px; */
color: #ffa500;
}
h1, h2, h3 {
font-weight: bold;
line-height: 1.2;
}
h2, h3 {
margin-bottom: 0;
color: #555;
}
h2 {
font-family: 'Nadia Serif', Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 115%;
/* text-shadow: -1px -1px 0 hsla(0,0%,100%,.6);
letter-spacing: -1px; */
}
h3 {
font-family: Cambria, "Palatino Linotype", "Book Antiqua", Palatino, serif;
font-size: 105%;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Boxes for flotr2 */
.m0-box-div {
height: 130px;
}
.m0-box {
width: 180px;
height: 100px;
float: right;
margin-right: 5px;
margin-left: 5px;
}
/* Specific layout for some vizs */
/*
MLS
*/
.mls-dyn-list {
float: left;
margin-left: 8px;
margin-right: 8px;
width: 380px;
}
#mls-envision .envision-component-container.envision-first {
width: 500px;
}
#mls-envision .envision-component-container {
width: 500px;
}
#mls-envision-lists .envision-component-container.envision-first {
width: 325px;
height : 150px;
}
#mls-envision-lists .report-summary .envision-component {
cursor: all-scroll;
height : 30px;
margin-top: -2px;
/* align envision and flotr2 graphs*/
margin-bottom: 200px;
}
/*
OTHER STYLES FOR SPECIFIC CHARTS
*/
.graph .flotr-grid-label {
font-size: 0.6em
}
.graph {
height:200px;
width:200px;
}
.bubbles {
height:300px;
width:600px;
}
.radar {
height:400px;
width:500px;
}
.demographics {
height:400px;
width:400px;
}
.treemap {
position: relative;
width: 700px;
height: 500px;
}
.treemap-node {
border: solid 1px white;
font: 10px sans-serif;
line-height: 12px;
overflow: hidden;
position: absolute;
text-indent: 2px;
}
.basic-metric-html {height:100px;}
.subreport-list {height:120px;}
.subreport-list-item {float:right;height:100px;width:40%;}/* Shared CSS Style in all Envision Bitergia Reports */
.envision-component-container {
width: 325px;
height : 50px;
}
.envision-component-container.envision-first {
width: 325px;
height : 200px;
}
.envision-component {
width: 100%;
height: 100%;
}
.report-connection.envision-component-container {
height: 20px;
}
.report-summary.envision-component-container {
cursor: all-scroll;
height : 50px;
margin-top: -2px;
}
/* .milestone0-scm-committers {
border-top: 0px;
}
*/
/* Connection overlay */
.milestone0-connection .canvas {
z-index: 10;
background: #fff;
}
.milestone0-connection .canvas .object {
position: absolute;
top: 0px;
}
/* X-Axis Labels */
.milestone0-summary .flotr-grid-label {
margin-top: 5px;
}
/* Mouse Tracker */
.envision-component-container.envision-first .flotr-mouse-value {
font-size: 12px;
display:inline;
}
.envision-component-container .flotr-mouse-value
{
display: none;
}
/* @media screen and (max-width: 600px) {
.milestone0-scm-commits {
width: 100%;
}
.milestone0-scm-commits .envision-component
{
height: 120px;
}
.milestone0-scm-summary .envision-component,
.milestone0-scm-committers .envision-component {
height: 40px;
}
} */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
dashboard/bitergia-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

21
dashboard/dashboard.css Normal file
View File

@ -0,0 +1,21 @@
body {
max-width: 900px;
width: 900px;
max-height: 700px;
height: 700px;
margin: 20px;
font: normal 0.75em georgia, sans-serif;
/* border-style: solid; */
border-width: 1px;
}
.box {
/* border-style: solid; */
border-width: 1px;
padding: 5px;
}
.dashboard_graph {
height: 200px;
width: 500px;
}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,31,14,6,19,24,39,33,22,19,20,32,11,1,4,8,13,2,4,2,5],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":1,"sent":385,"repositories":2}

View File

@ -0,0 +1 @@
{"senders":"OpenStack Jenkins","sent":385}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,5,6,7,0,0,1,2,2,1,1,3,2,5,1,3,2,4,4,1,3,3,1,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2,1,4,2,2,6,11,4,12,3,123,13,13,10,3,3,1,4,7,4,0,4,6,6,4,4,7,8,5,0,0,2,4,9,1,2,4,5,3,1,1,5,5,3,1,2,1,0,0],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,2,2,0,0,1,2,1,1,1,1,1,2,1,2,1,2,2,1,2,1,1,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,2,2,1,1,2,2,3,2,3,2,2,1,2,2,1,4,3,2,0,1,2,3,2,2,2,1,2,0,0,1,2,2,1,1,2,2,1,1,1,1,2,2,1,2,1,0,0],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,3,2,0,0,1,1,0,1,0,2,1,3,0,2,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,1,2,0,2,2,8,2,5,1,4,6,6,3,3,2,1,2,2,1,0,3,4,3,3,2,1,1,4,0,0,1,1,5,0,2,2,3,2,0,0,4,2,1,1,1,1,0,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,1,0,0,1,1,0,1,0,1,1,1,0,2,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,2,2,2,1,2,2,1,1,2,1,1,2,1,1,0,1,1,1,2,2,1,1,2,0,0,1,1,1,0,1,2,1,1,0,0,1,2,1,1,1,1,0,0]}

View File

@ -0,0 +1 @@
{"tickets":130,"opened":130,"openers":4,"first_date":"2011-02-10","last_date":"2013-03-17","closers":3,"closed":15,"changed":343,"changers":4,"trackers":13}

View File

@ -0,0 +1 @@
{"closers":["John Tran","Kevin Bringard","Jay Pipes"],"closed":[11,3,2]}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,12,4,4,10,9,13,7,15,1,4,1,1,3,0,0,0,4,19,13,2,4,4,8,1,3,1,4,6,12,6,4,9,3,6,15,4,1,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,2,1,1,3,2,2,2,1,1,1,1,2,0,0,0,2,2,2,2,2,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":4,"sent":237,"repositories":5}

View File

@ -0,0 +1 @@
{"senders":["Jay Pipes","John Tran","Yun Mao",""],"sent":[172,20,13,12]}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,1,1,0,1,0,0,2,0,0,0,2,3,0,1,0,0,0,2,0,0,0,0,0,1,1,3,2,6,1,0,1,2,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changers":[0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"opened":[0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"openers":[0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}

View File

@ -0,0 +1 @@
{"tickets":13,"opened":13,"openers":2,"first_date":"2010-07-23","last_date":"2011-03-10","closers":2,"closed":3,"changed":32,"changers":2,"trackers":5}

View File

@ -0,0 +1 @@
{"closers":["Todd Willey","Jake Dahn"],"closed":[2,1]}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":2,"sent":3,"repositories":2}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}

View File

@ -0,0 +1 @@
{"tickets":3,"opened":3,"openers":1,"first_date":"2012-01-24","last_date":"2012-08-08","closers":0,"closed":0,"changed":3,"changers":1,"trackers":1}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,9,12,9,0,3,2,0,0,0,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,7,0,9,5,7,6,1,0,1,0,0,4,2,7,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,2,3,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,9,10,8,0,2,0,0,0,0,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,5,0,6,5,7,6,1,0,1,0,0,4,1,4,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]}

View File

@ -0,0 +1 @@
{"tickets":127,"opened":127,"openers":1,"first_date":"2011-02-02","last_date":"2013-03-21","closers":1,"closed":4,"changed":130,"changers":1,"trackers":12}

View File

@ -0,0 +1 @@
{"closers":"Christian Berendt","closed":4}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":1,"sent":10,"repositories":3}

View File

@ -0,0 +1 @@
{"senders":"Christian Berendt","sent":10}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,2,5,0,3,1,1,2],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,0,3,0,1,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,0,1,0,1,0]}

View File

@ -0,0 +1 @@
{"tickets":10,"opened":10,"openers":1,"first_date":"2012-11-27","last_date":"2013-03-25","closers":0,"closed":0,"changed":19,"changers":1,"trackers":3}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":2,"sent":15,"repositories":1}

View File

@ -0,0 +1 @@
{"senders":"Sumit Naiksatam","sent":8}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,5,4,1,0,2,1,0,1,1,2,1,0,1,1,3,1,0,0,1,3,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,3,1,0,2,0,0,1,0,1,0,0,0,0,3,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}

View File

@ -0,0 +1 @@
{"tickets":16,"opened":16,"openers":1,"first_date":"2011-04-26","last_date":"2012-08-01","closers":0,"closed":0,"changed":36,"changers":1,"trackers":6}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":1,"sent":2,"repositories":1}

View File

@ -0,0 +1 @@
{"senders":"=?ISO-8859-1?Q?Rafael_Dur=E1n_Casta=F1eda?=","sent":2}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,2,0,0,0,0,0,8,3,2,5,4,0,2,2,1,0,1,1,0,0,0,0,0,0,1,0,2,2,0,0,0,1,0,0,0],"changers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,0,0,0,0,0,8,1,2,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0]}

View File

@ -0,0 +1 @@
{"tickets":23,"opened":23,"openers":1,"first_date":"2012-06-13","last_date":"2013-03-13","closers":1,"closed":10,"changed":25,"changers":1,"trackers":6}

View File

@ -0,0 +1 @@
{"closers":"Jose Castro Leon","closed":14}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"sent":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"senders":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"]}

View File

@ -0,0 +1 @@
{"senders":1,"sent":1,"repositories":1}

View File

@ -0,0 +1 @@
{"senders":"Luis Fernandez Alvarez","sent":1}

View File

@ -0,0 +1 @@
{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"week":[14756,14763,14770,14777,14784,14791,14798,14805,14812,14819,14826,14833,14840,14847,14854,14861,14868,14875,14882,14889,14896,14903,14910,14917,14924,14931,14938,14945,14952,14959,14966,14973,14980,14987,14994,15001,15008,15015,15022,15029,15036,15043,15050,15057,15064,15071,15078,15085,15092,15099,15106,15113,15120,15127,15134,15141,15148,15155,15162,15169,15176,15183,15190,15197,15204,15211,15218,15225,15232,15239,15246,15253,15260,15267,15274,15281,15288,15295,15302,15309,15316,15323,15330,15337,15344,15351,15358,15365,15372,15379,15386,15393,15400,15407,15414,15421,15428,15435,15442,15449,15456,15463,15470,15477,15484,15491,15498,15505,15512,15519,15526,15533,15540,15547,15554,15561,15568,15575,15582,15589,15596,15603,15610,15617,15624,15631,15638,15645,15652,15659,15666,15673,15680,15687,15694,15701,15708,15715,15722,15729,15736,15743,15750,15757,15764,15771,15778,15785,15792],"date":["May 2010","Jun 2010","Jun 2010","Jun 2010","Jun 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Jul 2010","Aug 2010","Aug 2010","Aug 2010","Aug 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Sep 2010","Oct 2010","Oct 2010","Oct 2010","Oct 2010","Nov 2010","Nov 2010","Nov 2010","Nov 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Dec 2010","Jan 2011","Jan 2011","Jan 2011","Jan 2011","Feb 2011","Feb 2011","Feb 2011","Feb 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Mar 2011","Apr 2011","Apr 2011","Apr 2011","Apr 2011","May 2011","May 2011","May 2011","May 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jun 2011","Jul 2011","Jul 2011","Jul 2011","Jul 2011","Aug 2011","Aug 2011","Aug 2011","Aug 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Sep 2011","Oct 2011","Oct 2011","Oct 2011","Oct 2011","Nov 2011","Nov 2011","Nov 2011","Nov 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Dec 2011","Jan 2012","Jan 2012","Jan 2012","Jan 2012","Feb 2012","Feb 2012","Feb 2012","Feb 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Mar 2012","Apr 2012","Apr 2012","Apr 2012","Apr 2012","May 2012","May 2012","May 2012","May 2012","May 2012","Jun 2012","Jun 2012","Jun 2012","Jun 2012","Jul 2012","Jul 2012","Jul 2012","Jul 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Aug 2012","Sep 2012","Sep 2012","Sep 2012","Sep 2012","Oct 2012","Oct 2012","Oct 2012","Oct 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Nov 2012","Dec 2012","Dec 2012","Dec 2012","Dec 2012","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Jan 2013","Feb 2013","Feb 2013","Feb 2013","Feb 2013","Mar 2013","Mar 2013","Mar 2013","Mar 2013"],"closed":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,3,2,2,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,4,2,0,1,0,1,1,0,0,0,0,2,0,1,0,0,0,1,0,0,0,0,1,1,1,2,0,1,1,1,1,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,9,0,2,0,1,2,4,0,10,1,3,0,0],"closers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,2,2,2,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,3,1,0,1,0,1,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,0],"changed":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,1,0,4,3,0,1,2,0,0,0,0,0,0,1,2,0,0,0,0,3,0,0,1,0,1,0,0,0,0,2,1,2,1,1,4,1,2,10,8,5,1,15,7,16,7,10,21,17,9,2,10,16,1,0,3,13,6,4,15,10,4,6,4,6,8,13,10,22,19,7,13,10,14,20,15,15,6,3,11,0,5,3,39,6,40,1,3,22,6,7,13,47,12,17,17,81,80,14,6,7,5,10,82,35,13,31,53,31,24,172,182,25,5,4,24,10,22,10,27,10,33,13,39,15,49,45,4],"changers":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,1,0,1,1,0,1,2,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,2,1,1,1,2,2,1,2,4,4,4,1,3,4,5,4,3,5,5,4,1,3,3,1,0,3,2,4,3,6,4,3,3,3,4,4,5,4,7,7,4,6,5,5,6,3,4,3,2,2,0,3,3,3,2,6,1,3,3,1,4,4,3,3,5,2,5,3,5,3,3,4,4,4,4,2,5,6,3,6,7,7,5,1,3,6,4,6,3,6,3,3,5,3,4,3,2,1],"opened":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,2,6,6,2,1,11,4,12,2,3,13,3,1,0,0,2,0,0,0,0,0,1,11,5,2,2,1,2,6,4,5,8,10,4,5,3,11,11,2,9,1,2,0,0,3,1,2,0,2,1,1,1,1,1,3,14,4,3,1,3,2,4,2,3,1,7,3,3,1,2,2,3,7,3,6,2,3,1,5,2,3,2,3,2,7,2,4,7,2,5,0],"openers":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,2,3,4,2,1,2,2,4,2,1,5,3,1,0,0,2,0,0,0,0,0,1,3,2,1,2,1,2,2,3,2,5,5,3,3,2,3,3,2,3,1,2,0,0,3,1,2,0,2,1,1,1,1,1,1,3,2,3,1,2,1,1,2,2,1,3,2,2,1,1,1,2,4,3,2,1,1,1,3,2,2,1,3,2,2,2,2,3,1,2,0]}

View File

@ -0,0 +1 @@
{"tickets":325,"opened":325,"openers":11,"first_date":"2010-10-12","last_date":"2013-03-25","closers":6,"closed":73,"changed":1367,"changers":13,"trackers":21}

Some files were not shown because too many files have changed in this diff Show More