This commit is contained in:
Tommy Parnell
2017-01-11 21:29:12 -05:00
commit 414395b87d
36 changed files with 1283 additions and 0 deletions

4
ui/.bowerrc Normal file
View File

@@ -0,0 +1,4 @@
{
"directory": "public/components",
"json": "bower.json"
}

10
ui/.editorconfig Normal file
View File

@@ -0,0 +1,10 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

4
ui/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
node_modules/
public/components
.nyc_output
.sass-cache

10
ui/.yo-rc.json Normal file
View File

@@ -0,0 +1,10 @@
{
"generator-express": {
"promptValues": {
"type": "Basic",
"viewEngine": "EJS",
"cssPreprocessor": "None",
"buildTool": "Gulp"
}
}
}

69
ui/app.js Normal file
View File

@@ -0,0 +1,69 @@
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var app = express();
var env = process.env.NODE_ENV || 'development';
app.locals.ENV = env;
app.locals.ENV_DEVELOPMENT = env == 'development';
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// app.use(favicon(__dirname + '/public/img/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err,
title: 'error'
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {},
title: 'error'
});
});
module.exports = app;

8
ui/bin/www Normal file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env node
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
console.log('Express server listening on port ' + server.address().port);
});

13
ui/bower.json Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "ui",
"version": "0.0.1",
"ignore": [
"**/.*",
"node_modules",
"components"
],
"dependencies": {
"rickshaw": "^1.6.0",
"jquery": "^3.1.1"
}
}

26
ui/gulpfile.js Normal file
View File

@@ -0,0 +1,26 @@
var gulp = require('gulp'),
nodemon = require('gulp-nodemon'),
plumber = require('gulp-plumber'),
livereload = require('gulp-livereload');
gulp.task('develop', function () {
livereload.listen();
nodemon({
script: 'bin/www',
ext: 'js ejs coffee',
stdout: false
}).on('readable', function () {
this.stdout.on('data', function (chunk) {
if(/^Express server listening on port/.test(chunk)){
livereload.changed(__dirname);
}
});
this.stdout.pipe(process.stdout);
this.stderr.pipe(process.stderr);
});
});
gulp.task('default', [
'develop'
]);

32
ui/package.json Normal file
View File

@@ -0,0 +1,32 @@
{
"name": "ui",
"version": "0.0.1",
"private": true,
"main": "app.js",
"scripts": {
"start": "node ./bin/www",
"test": "mocha --recursive test",
"test:coverage": "nyc npm test",
"test:unit": "mocha --recursive test/middleware test/models test/routes",
"test:integration": "mocha --recursive test/integration"
},
"dependencies": {
"express": "^4.13.3",
"serve-favicon": "^2.3.0",
"morgan": "^1.6.1",
"cookie-parser": "^1.3.3",
"body-parser": "^1.13.3",
"ejs": "^2.3.1"
},
"devDependencies": {
"chai": "^3.5.0",
"debug": "^2.2.0",
"gulp": "^3.9.0",
"gulp-nodemon": "^2.0.2",
"gulp-livereload": "^3.8.0",
"gulp-plumber": "^1.0.0",
"mocha": "^3.0.2",
"nyc": "^10.0.0",
"supertest": "^2.0.0"
}
}

8
ui/public/css/style.css Normal file
View File

@@ -0,0 +1,8 @@
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}
a {
color: #00B7FF;
}

10
ui/routes/index.js Normal file
View File

@@ -0,0 +1,10 @@
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
module.exports = router;

7
ui/views/error.ejs Normal file
View File

@@ -0,0 +1,7 @@
<% include header %>
<%- message %>
<%- error.status %>
<%- error.stack %>
<% include footer %>

2
ui/views/footer.ejs Normal file
View File

@@ -0,0 +1,2 @@
</body>
</html>

12
ui/views/header.ejs Normal file
View File

@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title><%- title %></title>
<link rel="stylesheet" href="/css/style.css">
<% if (ENV_DEVELOPMENT) { %>
<script src="http://localhost:35729/livereload.js"></script>
<% } %>
</head>
<body>

47
ui/views/index.ejs Normal file
View File

@@ -0,0 +1,47 @@
<% include header %>
<h1></h1>
<p>bitminer</p>
<div id="chart" style="height:500px"></div>
<link rel="stylesheet" type="text/css" href="/components/rickshaw/rickshaw.css" />
<script src="/components/moment/min/moment.min.js"></script>
<script src="/components/d3/d3.min.js"></script>
<script src="/components/rickshaw/rickshaw.min.js"></script>
<script src="/components/underscore/underscore-min.js"></script>
<script src="/components/jquery/jquery.min.js"></script>
<script>
var data = []
var graph = new Rickshaw.Graph({
element: document.querySelector("#chart"),
renderer: 'line',
series: [{
data: data,
//data: [ { x: parseInt(moment.utc('2017-01-01 10:01').format('X')), y: 20 }, { x: parseInt(moment.utc('2017-01-01 11:00').format('X')), y: 60 }],
color: 'steelblue'
}]
});
var yAxis = new Rickshaw.Graph.Axis.Y({
graph: graph,
tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
ticksTreatment: "glow"
});
var addData = function(){
data.length = 0
calculatedData = _.chain(sampleData)
.map(function(data){
return {x: parseInt(moment.utc(data.date).format('x')), y: data.value}
})
.sortBy(function(mappedObj){return mappedObj.x;}).value();
_.each(calculatedData, function(item){data.push(item)});
graph.update();
}
new Rickshaw.Graph.Axis.Time({
graph: graph
});
graph.render();
</script>
<% include footer %>