Added ability to CUD tags from the website

This commit is contained in:
Patrick McDonagh
2016-01-28 12:47:54 -06:00
parent 4da445d78f
commit 908b9713bb
6 changed files with 305 additions and 149 deletions

View File

@@ -65,15 +65,14 @@ var angular = function(req, res) {
res.render('angularIndex');
};
app.get('/json/get/id/:tagName', fns.getTagID); // Gets the id for a tag name
app.get('/json/tag/add/:tagName/:units/:min/:max', fns.createTag); // Adds a tag to the scan list
app.get('/json/tag/update/:id/:tagName/:units/:min/:max', fns.updateTag); // Updates tag data
app.get('/json/tag/delete/:tag', fns.deleteTag); // Removes a tag from the scan list
app.get('/json/tag/:id', fns.getTag); // Lists all tags in the scan list
app.get('/json/tag', fns.getAllTags); // Lists all tags in the scan list
app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag
app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list
app.post('/json/tag/add', fns.createTag); // Adds a tag to the scan list
app.post('/json/tag/update/', fns.updateTag); // Updates tag data
app.get('/json/tag/delete/:tag', fns.deleteTag); // Removes a tag from the scan list
app.get('/json/tag/:id', fns.getTag); // Lists all tags in the scan list
app.get('/json/tag', fns.getAllTags); // Lists all tags in the scan list
app.get('/json/val/:tag', fns.latestValueSingleTag); // Gets the latest value of a single tag
app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
app.get('/json/all', fns.latestValueAllTags); // Gets the latest values of all tags in the scan list
app.get('*', angular);

View File

@@ -1,53 +1,35 @@
// var dbFile = "/usr/db/data.db";
var dbFile = "/home/pi/data.db";
// var dbFile = '/Users/patrickjmcd/data.db';
// app.get('/json/add/:tag', fns.addTag); // Adds a tag to the scan list
// app.get('/json/remove/:tag', fns.removeTag); // Removes a tag from the scan list
// app.get('/json/val/:tag', fns.latestTagValue); // Gets the latest value of a single tag
// app.get('/json/series/:tag/:hours', fns.seriesTagValues); // Gets all the values of a tag for the last X hours
// app.get('/json/tags', fns.allTags); // Lists all tags in the scan list
// app.get('/json/all', fns.allValues); // Gets the latest values of all tags in the scan list
var getTagID = function(tagName, cb){
//Returns function(err, id)
exports.getAllTags = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT id FROM tags WHERE tagName = ?";
var query = "SELECT * FROM tags WHERE deleted = 0";
var prepQuery = db.prepare(query);
prepQuery.all(tagName, function(err, rows){
prepQuery.all(function(err, rows) {
prepQuery.finalize();
db.close();
if (err){
cb(err, null);
if (err) {
res.json({status:"error", message:err});
console.log(err);
} else {
cb(null, rows[0].id);
res.json({status:"OK", tags:rows});
}
})
});
});
};
exports.getTagID = function(req, res){
getTagID(req.params.tagName, function(err, id){
if (err){
console.log(err);
res.json({status:"error", message:err});
} else {
res.json({status: "OK", tagName: req.params.tagName, id: id});
}
})
};
exports.createTag = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "INSERT INTO tags (tagName, units, minExpected, maxExpected) VALUES (?, ?, ?, ?)";
var query = "INSERT INTO tags (tagName, units, minExpected, maxExpected, vanityName, description) VALUES (?, ?, ?, ?, ?, ?)";
var prepQuery = db.prepare(query);
prepQuery.run(req.params.tagName, req.params.units, req.params.min, req.params.max, function(err){
prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, function(err){
prepQuery.finalize();
db.close();
if (err) {
@@ -85,9 +67,9 @@ exports.updateTag = function(req, res){
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ? WHERE id = ?";
var query = "UPDATE tags set tagName = ?, units = ?, minExpected = ?, maxExpected = ?, vanityName = ?, description = ? WHERE id = ?";
var prepQuery = db.prepare(query);
prepQuery.run(req.params.tagName, req.params.units, req.params.min, req.params.max, req.params.id, function(err) {
prepQuery.run(req.body.tagName, req.body.units, req.body.minExpected, req.body.maxExpected, req.body.vanityName, req.body.description, req.body.id, function(err) {
prepQuery.finalize();
db.close();
if (err) {
@@ -120,9 +102,27 @@ exports.deleteTag = function(req, res){
});
};
exports.seriesTagValues = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME('now', '-1 HOUR')";
var prepQuery = db.prepare(query);
prepQuery.all(parseInt(req.params.tag), function(err, rows){
prepQuery.finalize();
db.close();
if (err){
console.log(err);
res.json({status:"error", message:err, query:query});
} else {
res.json({status:"OK", tag: req.params.tag, vals:rows});
}
})
});
};
exports.latestTagValue = function(req, res){
exports.latestValueSingleTag = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
@@ -143,49 +143,7 @@ exports.latestTagValue = function(req, res){
});
};
exports.seriesTagValues = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM vals WHERE tagID = ? AND dateAdded > DATETIME('now', '-24 HOUR')";
var prepQuery = db.prepare(query);
prepQuery.all(parseInt(req.params.tag), function(err, rows){
prepQuery.finalize();
db.close();
if (err){
console.log(err);
res.json({status:"error", message:err, query:query});
} else {
res.json({status:"OK", tag: req.params.tag, vals:rows});
}
})
});
};
exports.getAllTags = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);
db.serialize(function(){
var query = "SELECT * FROM tags WHERE deleted = 0";
var prepQuery = db.prepare(query);
prepQuery.all(function(err, rows) {
prepQuery.finalize();
db.close();
if (err) {
res.json({status:"error", message:err});
console.log(err);
} else {
res.json({status:"OK", tags:rows});
}
});
});
};
exports.allValues = function(req, res){
exports.latestValueAllTags = function(req, res){
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(dbFile);

View File

@@ -108,13 +108,57 @@ tsCtrlrs.factory('tags',function($q, $http, $log){
}
});
return deferred.promise;
}
};
var createTag = function(tag){
$http.post('/json/tag/add', {
tagName: tag.tagName,
vanityName: tag.vanityName,
units: tag.units,
minExpected: tag.minExpected,
maxExpected: tag.maxExpected,
description: tag.description
}).success(function(data){
return data;
});
};
var updateTag = function(tag){
$log.info("updateTag called with "+ JSON.stringify(tag));
$http.post('/json/tag/update', {
id: tag.id,
tagName: tag.tagName,
vanityName: tag.vanityName,
units: tag.units,
minExpected: tag.minExpected,
maxExpected: tag.maxExpected,
description: tag.description
}).success(function(data){
return data;
}).error(function(err){
$log.warn("updateTag Error: " + err);
});
};
var deleteTag = function(id){
var deferred = $q.defer();
var url = '/json/tag/delete/' + id;
$http.get(url).success(function(data) {
deferred.resolve({
status: data.status
});
});
return deferred.promise;
};
return {
getTag: getTag,
getTagList: getTagList,
getTagHistory: getTagHistory,
getCurrentValues: getCurrentValues
getCurrentValues: getCurrentValues,
createTag: createTag,
updateTag: updateTag,
deleteTag: deleteTag,
};
});
@@ -126,77 +170,132 @@ tsCtrlrs.controller('mainCtrl', function($scope, Page, Alerts) {
tsCtrlrs.controller('dashboardCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
Page.setTitle('Dashboard');
Page.setPage('dashboard');
$scope.loading = true;
var getCurrentValues = tags.getCurrentValues();
getCurrentValues.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.vals = data.vals;
$scope.error = false;
} else {
$scope.error = data.message;
}
});
$scope.loadDashboard = function(){
$scope.loading = true;
var getCurrentValues = tags.getCurrentValues();
getCurrentValues.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.vals = data.vals;
$scope.error = false;
} else {
$scope.error = data.message;
}
});
};
$scope.loadDashboard();
});
tsCtrlrs.controller('tagsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
Page.setTitle('Tags');
Page.setPage('tags');
$scope.loading = true;
var getTagList = tags.getTagList();
getTagList.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.tags = data.tags;
$scope.error = false;
} else {
$scope.error = data.message;
}
});
$scope.loadTagList = function(){
$scope.loading = true;
var getTagList = tags.getTagList();
getTagList.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.tags = data.tags;
$scope.error = false;
} else {
$scope.error = data.message;
}
});
};
$scope.loadTagList();
$scope.submitAddTag = function(){
var createStatus = tags.createTag($scope.newTag);
$scope.createStatus = createStatus.status;
$scope.loadTagList();
}
$scope.deleteTag = function(id){
var deleteTag = tags.deleteTag(id);
deleteTag.then(function(data){
$log.info("deleting tag "+ id + " status: " + data.status);
if (data.status == "OK"){
$scope.error = false;
$scope.loadTagList();
} else {
$scope.error = data.message;
}
})
};
$scope.openEditTag = function(id){
var getTag = tags.getTag(id);
getTag.then(function(data){
if (data.status == "OK"){
$scope.error = false;
$scope.editTag = data.tag;
$log.info("Started editing tag with parameters: "+ JSON.stringify($scope.editTag));
} else {
$scope.error = data.message;
}
});
};
$scope.submitEditTag = function(){
var editStatus = tags.updateTag($scope.editTag);
$log.info(editStatus);
$scope.editStatus = editStatus.status;
$scope.loadTagList();
}
});
tsCtrlrs.controller('tagValsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
Page.setTitle('Tag Series');
Page.setPage('tags');
$scope.loading = true;
var getTag = tags.getTag($routeParams.tagID);
getTag.then(function(tagData){
if (tagData.status == "OK"){
$scope.tag = tagData.tag;
Page.setTitle('Tag Series: '+ tagData.tag.tagName);
var getTagHistory = tags.getTagHistory($routeParams.tagID);
getTagHistory.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.data = data;
$scope.error = false;
$scope.loadTagVals = function(){
$scope.loading = true;
var getTag = tags.getTag($routeParams.tagID);
getTag.then(function(tagData){
if (tagData.status == "OK"){
$scope.tag = tagData.tag;
Page.setTitle('Tag Series: '+ tagData.tag.tagName);
var getTagHistory = tags.getTagHistory($routeParams.tagID);
getTagHistory.then(function(data) {
$scope.loading = false;
if (data.status == "OK"){
$scope.data = data;
$scope.error = false;
$scope.options = {
series: [
{
axis: "y",
dataset: "vals",
key: "val",
label: "Tag Value",
color: "#1f77b4",
type: ['line'],
id: 'tagChart'
}
],
axes: {
x: {
key: "id",
// type: "date"
}
}
};
} else {
$scope.error = data.message;
}
});
} else {
$scope.loading = false;
$scope.error = data.message;
}
});
};
$scope.loadTagVals();
$scope.options = {
series: [
{
axis: "y",
dataset: "vals",
key: "val",
label: "Tag Value",
color: "#1f77b4",
type: ['line'],
id: 'tagChart'
}
],
axes: {
x: {
key: "id",
// type: "date"
}
}
};
} else {
$scope.error = data.message;
}
});
} else {
$scope.loading = false;
$scope.error = data.message;
}
});
});

View File

@@ -13,12 +13,14 @@
<div class="col-md=12">
<h1>Error Caught!</h1>
<pre>{{message}}</pre>
<button ng-click="loadDashboard()" class="btn btn-large btn-danger">Reload Dashboard</button>
</div>
</div>
</div>
<div ng-if="!error" class="container">
<div class="row">
<button ng-click="loadDashboard()" class="btn btn-large btn-success">Reload Dashboard</button>
<div ng-repeat="val in vals">
<div class="col-md-4" style="height:200px">
<just-gage id="{{val.vanityName}}" min='val.min' max='val.max' value='val.val' options="{label:val.units,title:val.vanityName, decimals:2, refreshAnimationType:'bounce', startAnimationType:'bounce'}"></just-gage>

View File

@@ -13,12 +13,14 @@
<div class="col-md=12">
<h1>Error Caught!</h1>
<pre>{{message}}</pre>
<button ng-click="loadTagVals()" class="btn btn-large btn-danger">Reload Values</button>
</div>
</div>
</div>
<div ng-if="!error" class="container">
<div class="row">
<button ng-click="loadTagVals()" class="btn btn-large btn-success">Reload Values</button>
<div class="col-md-8">
<div class="tagChart" style="height:400px;">
<linechart data="data" options="options"></linechart>

View File

@@ -1,3 +1,96 @@
<div class="modal fade" id="addModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Add a New Tag...</h4>
</div>
<div class="modal-body">
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
<form>
<div class="form-group">
<label for="tagName">Tag Name</label>
<input type="text" ng-model="newTag.tagName" class="form-control" id="tagName" placeholder="Tag Name Here">
</div>
<div class="form-group">
<label for="vanityName">Vanity Name</label>
<input type="text" ng-model="newTag.vanityName" class="form-control" id="vanityName" placeholder="Vanity Name Here">
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="textarea" ng-model="newTag.description" class="form-control" id="description" placeholder="Tag Description Here">
</div>
<div class="form-group">
<label for="minExpected">Minimum Value Expected</label>
<input type="number" ng-model="newTag.minExpected" class="form-control" id="minExpected" placeholder="0">
</div>
<div class="form-group">
<label for="maxExpected">Maximum Value Expected</label>
<input type="number" ng-model="newTag.maxExpected" class="form-control" id="maxExpected" placeholder="100">
</div>
<div class="form-group">
<label for="units">Units</label>
<input type="text" ng-model="newTag.units" class="form-control" id="units" placeholder="lbs, PSI, in, etc.">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" ng-click="submitAddTag();" data-dismiss="modal">Add Tag</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="modal fade" id="editModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Edit a Tag...</h4>
</div>
<div class="modal-body">
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
<form>
<div class="form-group">
<label for="tagName">Tag Name</label>
<input type="text" ng-model="editTag.tagName" class="form-control" id="tagName" placeholder="Tag Name Here">
</div>
<div class="form-group">
<label for="vanityName">Vanity Name</label>
<input type="text" ng-model="editTag.vanityName" class="form-control" id="vanityName" placeholder="Vanity Name Here">
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="textarea" ng-model="editTag.description" class="form-control" id="description" placeholder="Tag Description Here">
</div>
<div class="form-group">
<label for="minExpected">Minimum Value Expected</label>
<input type="number" ng-model="editTag.minExpected" class="form-control" id="minExpected" placeholder="0">
</div>
<div class="form-group">
<label for="maxExpected">Maximum Value Expected</label>
<input type="number" ng-model="editTag.maxExpected" class="form-control" id="maxExpected" placeholder="100">
</div>
<div class="form-group">
<label for="units">Units</label>
<input type="text" ng-model="editTag.units" class="form-control" id="units" placeholder="lbs, PSI, in, etc.">
</div>
</form>
<pre>{{editTag}}</pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" ng-click="submitEditTag();" data-dismiss="modal">Submit Tag Edits</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div ng-if="loading" class="container">
<div class="row">
<div class="col-md-12 well" style="text-align:center;">
@@ -39,11 +132,14 @@
<td>{{tag.minExpected}}</td>
<td>{{tag.maxExpected}}</td>
<td>{{tag.units}}</td>
<td><button class="btn btn-primary">Edit</button></td>
<td><button class="btn btn-danger">Delete</button></td>
<td><button data-toggle="modal" data-target="#editModal" ng-click="openEditTag(tag.id)" class="btn btn-primary">Edit</button></td>
<td><button ng-click="deleteTag(tag.id)" class="btn btn-danger">Delete</button></td>
</tr>
</tbody>
</table>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addModal">
Add Tag
</button>
</div>
</div>
</div>