1
0
Fork 0

Merge pull request #123 from satnogs/linters

Add linters
pull/124/head
Nikos Roussos 2017-02-12 20:13:05 +02:00 committed by GitHub
commit ee19367ad8
9 changed files with 358 additions and 225 deletions

35
.eslintrc.json 100644
View File

@ -0,0 +1,35 @@
{
"env": {
"browser": true,
"es6": true,
"jquery": true
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
4
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
],
"curly": [
"error",
"all"
],
"one-var-declaration-per-line": [
"error",
"always"
],
"new-cap": "error"
}
}

91
.stylelintrc 100644
View File

@ -0,0 +1,91 @@
{
"rules": {
"color-hex-case": "lower",
"color-no-invalid-hex": true,
"font-family-no-duplicate-names": true,
"font-family-name-quotes": "always-where-recommended",
"function-calc-no-unspaced-operator": true,
"function-comma-space-after": "always",
"function-comma-space-before": "never",
"function-name-case": "lower",
"function-parentheses-space-inside": "never",
"function-whitespace-after": "always",
"function-url-no-scheme-relative": true,
"function-url-quotes": "always",
"number-no-trailing-zeros": true,
"string-no-newline": true,
"string-quotes": "single",
"length-zero-no-unit": true,
"unit-case": "lower",
"unit-no-unknown": true,
"value-keyword-case": lower,
"value-list-comma-space-after": "always-single-line",
"value-list-comma-space-before": "never",
"property-case": "lower",
"property-no-unknown": true,
"keyframe-declaration-no-important": true,
"declaration-colon-space-after": "always",
"declaration-colon-space-before": "never",
"declaration-no-important": true,
"declaration-block-trailing-semicolon": "always",
"declaration-block-single-line-max-declarations": 1,
"declaration-block-semicolon-space-before": "never",
"declaration-block-semicolon-newline-after": "always-multi-line",
"declaration-block-no-shorthand-property-overrides": true,
"declaration-block-no-duplicate-properties": true,
"block-no-empty": true,
"block-closing-brace-empty-line-before": "never",
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-before": "always-multi-line",
"block-closing-brace-space-before": "always-single-line",
"block-opening-brace-newline-after": "always-multi-line",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
"selector-attribute-brackets-space-inside": "never",
"selector-attribute-operator-space-after": "never",
"selector-attribute-operator-space-before": "never",
"selector-combinator-space-after": "always",
"selector-combinator-space-before": "always",
"selector-pseudo-class-no-unknown": true,
"selector-pseudo-element-no-unknown": true,
"selector-pseudo-class-case": "lower",
"selector-pseudo-element-case": "lower",
"selector-type-case": "lower",
"selector-type-no-unknown": true,
"selector-max-empty-lines": 0,
"rule-empty-line-before": "always-multi-line",
"media-feature-name-case": "lower",
"media-feature-name-no-unknown": true,
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"media-feature-parentheses-space-inside": "never",
"comment-no-empty": true,
"indentation": 4,
"max-nesting-depth": 6,
"no-duplicate-selectors": true,
"no-eol-whitespace": true,
"no-extra-semicolons": true,
"no-unknown-animations": true,
"no-invalid-double-slash-comments": true,
"no-missing-end-of-source-newline": true,
"max-empty-lines": 1
}
}

View File

@ -1,9 +1,11 @@
language: python
dist: trusty
python:
- "2.7"
install:
- pip install flake8
- npm install -g jshint
- npm install -g eslint stylelint
script:
- flake8 .
- jshint .
- eslint 'db/static/js/*.js'
- stylelint 'db/static/css/*.css'

View File

@ -2,61 +2,56 @@
==================== */
@font-face {
font-family: 'ClearSans';
font-family: ClearSans;
src: url('../fonts/ClearSans-Regular.eot');
src: url('../fonts/ClearSans-Regular.eot?#iefix') format('embedded-opentype'),
url('../fonts/ClearSans-Regular.woff') format('woff'),
url('../fonts/ClearSans-Regular.ttf') format('truetype'),
url('../fonts/ClearSans-Regular.svg#open_sans') format('svg');
url('../fonts/ClearSans-Regular.woff') format('woff'),
url('../fonts/ClearSans-Regular.ttf') format('truetype'),
url('../fonts/ClearSans-Regular.svg#open_sans') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'ClearSans';
font-family: ClearSans;
src: url('../fonts/ClearSans-Bold.eot');
src: url('../fonts/ClearSans-Bold.eot?#iefix') format('embedded-opentype'),
url('../fonts/ClearSans-Bold.woff') format('woff'),
url('../fonts/ClearSans-Bold.ttf') format('truetype'),
url('../fonts/ClearSans-Bold.svg#open_sansbold') format('svg');
url('../fonts/ClearSans-Bold.woff') format('woff'),
url('../fonts/ClearSans-Bold.ttf') format('truetype'),
url('../fonts/ClearSans-Bold.svg#open_sansbold') format('svg');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'ClearSans';
font-family: ClearSans;
src: url('../fonts/ClearSans-BoldItalic.eot');
src: url('../fonts/ClearSans-BoldItalic.eot?#iefix') format('embedded-opentype'),
url('../fonts/ClearSans-BoldItalic.woff') format('woff'),
url('../fonts/ClearSans-BoldItalic.ttf') format('truetype'),
url('../fonts/ClearSans-BoldItalic.svg#open_sansbold_italic') format('svg');
url('../fonts/ClearSans-BoldItalic.woff') format('woff'),
url('../fonts/ClearSans-BoldItalic.ttf') format('truetype'),
url('../fonts/ClearSans-BoldItalic.svg#open_sansbold_italic') format('svg');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'ClearSans';
font-family: ClearSans;
src: url('../fonts/ClearSans-Italic.eot');
src: url('../fonts/ClearSans-Italic.eot?#iefix') format('embedded-opentype'),
url('../fonts/ClearSans-Italic.woff') format('woff'),
url('../fonts/ClearSans-Italic.ttf') format('truetype'),
url('../fonts/ClearSans-Italic.svg#open_sansitalic') format('svg');
url('../fonts/ClearSans-Italic.woff') format('woff'),
url('../fonts/ClearSans-Italic.ttf') format('truetype'),
url('../fonts/ClearSans-Italic.svg#open_sansitalic') format('svg');
font-weight: normal;
font-style: italic;
}
/* Generic
==================== */
body {
font-size:14px;
font-size: 14px;
line-height: 1.3;
font-family:'ClearSans';
font-family: ClearSans;
}
.alert-debug {
@ -90,9 +85,8 @@ body {
}
.error {
margin-top: 40px;
margin-top: 40px auto 0 auto;
width: 500px;
margin: auto;
text-align: center;
}
@ -117,13 +111,13 @@ body {
width: 80px;
}
.stats {
.statistics {
text-align: center;
text-shadow: 1px 1px 2px rgba(150, 150, 150, 0.77) !important;
text-shadow: 1px 1px 2px rgba(150, 150, 150, 0.77);
margin-top: 12px;
}
.stats > img {
.statistics > img {
max-width: 20px;
}
@ -146,19 +140,18 @@ body {
a.satellite-item {
min-height: 120px;
padding: 10px;
border: 1px solid #FFF;
border: 1px solid #ffffff;
cursor: pointer;
display: block;
background-image: linear-gradient(to bottom, #FFF 0px, #F4F4F4 100%);
background-image: linear-gradient(to bottom, #ffffff 0, #f4f4f4 100%);
color: black;
text-decoration: none;
border: medium none;
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);
border-radius: 5px;
}
a.satellite-item:hover {
box-shadow: 0px 2px 5px #808080;
box-shadow: 0 2px 5px #808080;
transition: all 0.3s ease-out 0s;
}
@ -215,7 +208,7 @@ a.satellite-item:hover {
.satellite-transmitters {
position: absolute;
bottom: 0px;
bottom: 0;
}
.satellite-transmitters > span {
@ -226,7 +219,7 @@ a.satellite-item:hover {
}
.panel-transmitter {
margin: 20px 0px;
margin: 20px 0;
}
.panel-first {
@ -273,7 +266,7 @@ footer {
}
.stage-notice {
background-color: #D74545;
background-color: #d74545;
color: white;
padding: 5px;
text-align: center;
@ -281,15 +274,16 @@ footer {
z-index: 20;
width: 100%;
position: fixed;
top: 0px;
left: 0px;
top: 0;
left: 0;
}
.stage-notice a {
color: #ffff00;
}
@media screen and (max-width:768px) {
@media screen and (max-width: 768px) {
#map {
margin-top: 10px;
}
@ -299,25 +293,24 @@ footer {
}
}
/* Statistics page
==================== */
.stats {
padding-top: 20px;
padding-bottom: 20px;
}
.stats-hud {
padding: 15px;
padding: 15px;
}
.stats-hud-num {
display: block;
font-size: 2em;
font-size: 2em;
font-weight: bold;
}
/* Telemetry D3 visualisation
============================= */
@ -351,17 +344,17 @@ svg.chart {
position: absolute;
background: #286090;
color: #fff;
font-family: 'ClearSans';
font-family: ClearSans;
font-size: 12px;
text-align: center;
padding: 5px 5px 6px 5px;
border: 0px;
border: 0;
border-radius: 3px;
}
.tick line, .domain {
fill: none;
stroke: #ddd;
fill: none;
stroke: #ddd;
}
.line {
@ -378,11 +371,11 @@ svg.chart {
}
.datepicker input {
font-family: 'ClearSans';
font-family: ClearSans;
font-size: 13px;
padding: 5px 10px;
border: none;
box-shadow: inset 0px 0px 8px rgba(0,0,0,0.3);
box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.3);
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
cursor: pointer;

View File

@ -1,3 +1,4 @@
/* global d3 Backbone moment _ */
// D3 visualisation
d3.lineChart = function(telemetry_key, unit) {
@ -10,9 +11,9 @@ d3.lineChart = function(telemetry_key, unit) {
var svg;
// Define the div for the tooltip
var div = d3.select("body").append("div")
.attr("class", "chart-tooltip")
.style("opacity", 0);
var div = d3.select('body').append('div')
.attr('class', 'chart-tooltip')
.style('opacity', 0);
function render(selection) {
selection.each(function(_data) {
@ -21,7 +22,7 @@ d3.lineChart = function(telemetry_key, unit) {
var x1 = d3.scale.ordinal()
.domain(_data.map(function(d, i){
.domain(_data.map(function(d){
return parseDate(d.telemetry.observation_datetime);
}))
.rangePoints([0, chartW]);
@ -29,17 +30,17 @@ d3.lineChart = function(telemetry_key, unit) {
var y1;
switch(_data.length) {
case 1:
y1 = d3.scale.linear()
.domain([0, d3.max(_data, function(d, i){ return +d.telemetry.damod_data[telemetry_key]; })])
.range([chartH, 0])
.nice(4);
break;
default:
y1 = d3.scale.linear()
.domain(d3.extent(_data, function(d, i){ return +d.telemetry.damod_data[telemetry_key]; }))
case 1:
y1 = d3.scale.linear()
.domain([0, d3.max(_data, function(d){ return +d.telemetry.damod_data[telemetry_key]; })])
.range([chartH, 0])
.nice(4);
break;
default:
y1 = d3.scale.linear()
.domain(d3.extent(_data, function(d){ return +d.telemetry.damod_data[telemetry_key]; }))
.range([chartH, 0])
.nice(4);
}
var xAxis = d3.svg.axis()
@ -74,83 +75,83 @@ d3.lineChart = function(telemetry_key, unit) {
.transition()
.call(yAxis);
svg.selectAll(".x-axis-group.axis text") // select all the text elements for the xaxis
.attr("transform", function(d) {
return "translate(-50,50)rotate(-45)";
svg.selectAll('.x-axis-group.axis text') // select all the text elements for the xaxis
.attr('transform', function() {
return 'translate(-50,50)rotate(-45)';
});
// Axis labels
svg.append("text")
.attr("transform", "translate(" + (chartW + config.margin.right + 18) + " ," + (chartH + 10) + ")")
.style("text-anchor", "middle")
.text("Observation Datetime");
svg.append('text')
.attr('transform', 'translate(' + (chartW + config.margin.right + 18) + ' ,' + (chartH + 10) + ')')
.style('text-anchor', 'middle')
.text('Observation Datetime');
svg.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 40)
.attr("x", 0 - (chartH / 2))
.attr("dy", "1em")
.style("text-anchor", "middle")
.text("Value (" + unit + ")");
svg.append('text')
.attr('transform', 'rotate(-90)')
.attr('y', 40)
.attr('x', 0 - (chartH / 2))
.attr('dy', '1em')
.style('text-anchor', 'middle')
.text('Value (' + unit + ')');
switch(_data.length) {
case 1:
// Add the scatterplot
svg.selectAll("dot")
.data(_data)
.enter().append("circle")
.attr("r", 4)
.attr("cx", function(d, i) { return chartW / 2 + config.margin.left; })
.attr("cy", function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr("class", "circle")
.on("mouseover", function(d) {
div.transition()
.duration(200)
.style("opacity", 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 26) + "px");
})
.on("mouseout", function(d) {
div.transition()
.duration(500)
.style("opacity", 0);
});
break;
default:
var xInterval = chartW / (_data.length - 1);
case 1:
// Add the scatterplot
svg.selectAll('dot')
.data(_data)
.enter().append('circle')
.attr('r', 4)
.attr('cx', function() { return chartW / 2 + config.margin.left; })
.attr('cy', function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr('class', 'circle')
.on('mouseover', function(d) {
div.transition()
.duration(200)
.style('opacity', 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
.style('left', (d3.event.pageX) + 'px')
.style('top', (d3.event.pageY - 26) + 'px');
})
.on('mouseout', function() {
div.transition()
.duration(500)
.style('opacity', 0);
});
break;
default:
var xInterval = chartW / (_data.length - 1);
// Define the line
var valueline = d3.svg.line()
.x(function(d,i) { return (xInterval*i + config.margin.left); })
.y(function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; });
// Define the line
var valueline = d3.svg.line()
.x(function(d,i) { return (xInterval*i + config.margin.left); })
.y(function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; });
// Add the valueline path
svg.append("path")
.attr("class", "line")
.attr("d", valueline(_data));
// Add the valueline path
svg.append('path')
.attr('class', 'line')
.attr('d', valueline(_data));
// Add the scatterplot
svg.selectAll("dot")
.data(_data)
.enter().append("circle")
.attr("r", 4)
.attr("cx", function(d, i) { return xInterval*i + config.margin.left; })
.attr("cy", function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr("class", "circle")
.on("mouseover", function(d) {
div.transition()
.duration(200)
.style("opacity", 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 26) + "px");
})
.on("mouseout", function(d) {
div.transition()
.duration(500)
.style("opacity", 0);
});
// Add the scatterplot
svg.selectAll('dot')
.data(_data)
.enter().append('circle')
.attr('r', 4)
.attr('cx', function(d, i) { return xInterval*i + config.margin.left; })
.attr('cy', function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr('class', 'circle')
.on('mouseover', function(d) {
div.transition()
.duration(200)
.style('opacity', 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
.style('left', (d3.event.pageX) + 'px')
.style('top', (d3.event.pageY - 26) + 'px');
})
.on('mouseout', function() {
div.transition()
.duration(500)
.style('opacity', 0);
});
}
@ -185,12 +186,12 @@ if (has_telemetry_data) {
// Backbone Models
var TelemetryData = Backbone.Model.extend({});
Backbone.Model.extend({});
// Backbone Collections
var TelemetryCollection = Backbone.Collection.extend({
url:"/api/telemetry/?satellite=" + satelliteId
url:'/api/telemetry/?satellite=' + satelliteId
});
var TelemetryDescriptors = TelemetryCollection.extend({
@ -206,7 +207,7 @@ if (has_telemetry_data) {
return( collection.get('telemetry').observation_datetime );
},
byDate: function (start_date, end_date) {
filtered = this.filter(function (model) {
var filtered = this.filter(function (model) {
var date = parseDateFilter(model.get('telemetry').observation_datetime);
return ( date >= start_date && date <= end_date );
});
@ -217,7 +218,7 @@ if (has_telemetry_data) {
// Backbone Views
var TelemetryDescriptorsView = Backbone.View.extend({
el: "#telemetry-descriptors",
el: '#telemetry-descriptors',
template: _.template($('#telemetryDescriptorsTemplate').html()),
initialize: function(){
this.listenTo(this.collection, 'add reset change remove', this.renderItem);
@ -230,7 +231,7 @@ if (has_telemetry_data) {
});
var TelemetryChartView = Backbone.View.extend({
el: ".chart",
el: '.chart',
chart: null,
chartSelection: null,
initialize: function() {
@ -238,10 +239,10 @@ if (has_telemetry_data) {
this.updateDates(moment().subtract(7, 'days').format('YYYY/MM/DD'), moment().format('YYYY/MM/DD'));
this.renderPlaceholder();
this.collection.on('update filter', this.render, this);
chart = d3.lineChart();
d3.lineChart();
},
events: {
"click .telemetry-key": "updateKey",
'click .telemetry-key': 'updateKey',
},
render: function() {
if (this.collection.length > 0) {
@ -258,12 +259,12 @@ if (has_telemetry_data) {
},
renderPlaceholder: function() {
$('#telemetry-descriptors').hide();
$('#data-available').html("<p>There is no data available for the selected dates.</p>");
$('#data-available').html('<p>There is no data available for the selected dates.</p>');
d3.select('svg').remove();
},
updateKey: function(e){
d3.select('svg').remove();
this.chartSelection.call(d3.lineChart($(e.currentTarget).data("key"), $(e.currentTarget).data("unit")));
this.chartSelection.call(d3.lineChart($(e.currentTarget).data('key'), $(e.currentTarget).data('unit')));
var active = $(e.currentTarget);
active.addClass('active');
$('li').not(active).removeClass('active');
@ -276,23 +277,23 @@ if (has_telemetry_data) {
// Fetch data and render views
var telemetryDescriptorsView = new TelemetryDescriptorsView({ collection: new TelemetryDescriptors() });
new TelemetryDescriptorsView({ collection: new TelemetryDescriptors() });
var telemetryValues = new TelemetryValues();
var telemetryChartView = new TelemetryChartView({collection: telemetryValues});
$('input[name="daterange"]').daterangepicker(
{
locale: {
format: 'YYYY/MM/DD'
format: 'YYYY/MM/DD'
},
dateLimit: {
"days": 60
'days': 60
},
autoApply: true,
startDate: moment().subtract(7, 'days').format('YYYY/MM/DD'),
endDate: moment().format('YYYY/MM/DD'),
},
function(start, end, label) {
function(start, end) {
telemetryChartView.updateDates(start.format('YYYYMMDD'), end.format('YYYYMMDD'));
}
);

View File

@ -7,7 +7,7 @@ $(document).ready(function() {
});
var t = $('input');
t.bind('propertychange keyup input paste', function(event) {
t.bind('propertychange keyup input paste', function() {
var term = t.val().toLowerCase();
if (term !== '') {
$('.satellite-group-item').hide();

View File

@ -1,3 +1,5 @@
/*global L */
$(document).ready(function() {
'use strict';
@ -17,16 +19,16 @@ $(document).ready(function() {
var geojson = {
type: 'FeatureCollection',
features: [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [lon, lat]
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [lon, lat]
},
"properties": {
"icon": {
"iconUrl": "/static/img/satellite-marker.png",
"iconSize": [32, 32],
"iconAnchor": [16, 16],
'properties': {
'icon': {
'iconUrl': '/static/img/satellite-marker.png',
'iconSize': [32, 32],
'iconAnchor': [16, 16],
}
}
}]

View File

@ -1,74 +1,83 @@
$.getJSON( "/statistics/", function( data ) {
/* global Chart */
var i, r, g, b, a;
// Create colors for Mode Chart
var mode_colors = [];
for (i = 0; i < data.mode_label.length; i++) {
r = Math.floor(data.mode_data[i]* 10);
b = Math.floor(0.3 * 255);
g = Math.floor(data.mode_data[i]* 10);
a = 0.5;
color = "rgba(" + r + "," + g + "," + b + "," + a + ")";
mode_colors.push(color);
}
$(document).ready(function() {
// Create colors for Band Chart
var band_colors = [];
for (i = 0; i < data.band_label.length; i++) {
b = Math.floor(0.1 * 255);
g = Math.floor(data.band_data[i]);
r = Math.floor(data.band_data[i]);
a = 0.5;
color = "rgba(" + r + "," + g + "," + b + "," + a + ")";
band_colors.push(color);
}
$.getJSON('/statistics/', function( data ) {
// Global chart configuration
Chart.defaults.global.legend.display = false;
Chart.defaults.global.title.display = true;
Chart.defaults.global.title.fontSize = 16;
Chart.defaults.global.title.fontColor= '#444';
//Mode Chart
var mode_c = document.getElementById("modes");
var modeChart = new Chart(mode_c, {
type: 'doughnut',
data: {
labels: data.mode_label,
datasets: [{
backgroundColor: mode_colors,
data: data.mode_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.mode_data.length + ' Modes'
}
var i;
var r;
var g;
var b;
var a;
// Create colors for Mode Chart
var mode_colors = [];
for (i = 0; i < data.mode_label.length; i++) {
r = Math.floor(data.mode_data[i]* 10);
b = Math.floor(0.3 * 255);
g = Math.floor(data.mode_data[i]* 10);
a = 0.5;
var color = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
mode_colors.push(color);
}
});
//Band Chart
var band_c = document.getElementById("bands");
var bandChart = new Chart(band_c, {
type: 'doughnut',
data: {
labels: data.band_label,
datasets: [{
backgroundColor: band_colors,
data: data.band_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.band_data.length + ' Bands'
}
// Create colors for Band Chart
var band_colors = [];
for (i = 0; i < data.band_label.length; i++) {
b = Math.floor(0.1 * 255);
g = Math.floor(data.band_data[i]);
r = Math.floor(data.band_data[i]);
a = 0.5;
color = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
band_colors.push(color);
}
});
//HUD Stats
$('#stats-alive').html(data.transmitters_alive);
$('#stats-transmitters').html(data.transmitters);
$('#stats-satellites').html(data.total_satellites);
// Global chart configuration
Chart.defaults.global.legend.display = false;
Chart.defaults.global.title.display = true;
Chart.defaults.global.title.fontSize = 16;
Chart.defaults.global.title.fontColor= '#444';
//Mode Chart
var mode_c = document.getElementById('modes');
new Chart(mode_c, {
type: 'doughnut',
data: {
labels: data.mode_label,
datasets: [{
backgroundColor: mode_colors,
data: data.mode_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.mode_data.length + ' Modes'
}
}
});
//Band Chart
var band_c = document.getElementById('bands');
new Chart(band_c, {
type: 'doughnut',
data: {
labels: data.band_label,
datasets: [{
backgroundColor: band_colors,
data: data.band_data,
borderWidth: 1
}]
},
options: {
title : {
text: data.band_data.length + ' Bands'
}
}
});
//HUD Stats
$('#stats-alive').html(data.transmitters_alive);
$('#stats-transmitters').html(data.transmitters);
$('#stats-satellites').html(data.total_satellites);
});
});

View File

@ -14,27 +14,27 @@
<div class="col-md-4">
<div class="row hidden-xs hidden-sm">
<div class="{% if suggestions %}col-md-3{% else %}col-md-4{% endif %}">
<p class="stats">
<p class="statistics">
<img src="{% static 'img/satellites.png' %}">
{{ satellites.count }}
</p>
</div>
<div class="{% if suggestions %}col-md-3{% else %}col-md-4{% endif %}">
<p class="stats">
<p class="statistics">
<img src="{% static 'img/transmitters.png' %}">
{{ transmitters }}
</p>
</div>
{% if suggestions %}
<div class="col-md-3">
<p class="stats">
<p class="statistics">
<img src="{% static 'img/suggestions.png' %}">
{{ suggestions }}
</p>
</div>
{% endif %}
<div class="{% if suggestions %}col-md-3{% else %}col-md-4{% endif %}">
<p class="stats">
<p class="statistics">
<img src="{% static 'img/contributors.png' %}">
{{ contributors }}
</p>