Completes POCONSOLE-48. Notes page working.

This commit is contained in:
Patrick McDonagh
2016-11-16 16:39:29 -06:00
parent a3d8b3c95e
commit b6b8de4893
10 changed files with 358 additions and 34 deletions

View File

@@ -292,7 +292,7 @@ class Note(db.Model):
__tablename__ = "notes"
_id = db.Column(db.Integer, primary_key=True)
note_text = db.Column(db.String(256))
author = db.String(128)
author = db.Column(db.String(128))
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)

View File

@@ -39,7 +39,7 @@
<li ng-class="{active: Page.page() == 'gaugeoff'}"><a href="/#/gaugeoff"><i class="fa fa-folder-open-o"></i> Gauge Off</a></li>
<li ng-class="{active: Page.page() == 'welltest'}"><a href="/#/welltest"><i class="fa fa-folder-open-o"></i> Well Test</a></li>
<li ng-class="{active: Page.page() == 'events'}"><a href="/#/events"><i class="fa fa-folder-open-o"></i> Events</a></li>
<li ng-class="{active: Page.page() == 'docs'}"><a href="/#/docs"><i class="fa fa-folder-open-o"></i> Notes</a></li>
<li ng-class="{active: Page.page() == 'notes'}"><a href="/#/notes"><i class="fa fa-folder-open-o"></i> Notes</a></li>
<li ng-class="{active: Page.page() == 'docs'}"><a href="/#/docs"><i class="fa fa-folder-open-o"></i> Docs</a></li>
</ul>
@@ -80,6 +80,7 @@
<script src="js/tags.factory.js"></script>
<script src="js/cards.factory.js"></script>
<script src="js/welltest.factory.js"></script>
<script src="js/notes.factory.js"></script>
<script src="js/config.controller.js"></script>
<script src="js/dashboard.controller.js"></script>
@@ -90,6 +91,7 @@
<script src="js/gaugeoff.controller.js"></script>
<script src="js/welltest.controller.js"></script>
<script src="js/events.controller.js"></script>
<script src="js/notes.controller.js"></script>
</body>

View File

@@ -0,0 +1,93 @@
poconsole.controller('notesCtrl', function($scope, Page, Note) {
Page.setTitle('Notes');
Page.setPage('notes');
$scope.loadNotesPageData = function(page_number){
var getData = Note.getNotesPage(page_number);
getData.then(function(d){
for(var j = 0; j < d.objects.length; j++){
// console.log({'Date Before':d.objects[j].created_on});
d.objects[j].created_on = Date.create(d.objects[j].created_on + "Z", { fromUTC: true });
// console.log({'Date After':d.objects[j].created_on});
}
$scope.notes_data = d.objects;
$scope.num_pages = d.total_pages;
$scope.page_list = [];
$scope.page_num = d.page;
if ($scope.page_num < $scope.num_pages){
$scope.page_num_next = $scope.page_num + 1;
} else {
$scope.page_num_next = $scope.num_pages;
}
if ($scope.page_num > 1){
$scope.page_num_prev = $scope.page_num - 1;
} else {
$scope.page_num_prev = 1;
}
for(var i = 1; i <= $scope.num_pages; i++){
$scope.page_list.push(i);
}
});
};
$scope.loadNotesPageData(1);
$scope.startCreateNote = function(){
$scope.newNote = {
'note_text': "SAMPLE TEXT",
'author': "Mark Twain",
'created_on': Date.create()
};
};
$scope.submitNewNote = function(){
var temp_date = Date.create($scope.newNote.created_on);
$scope.newNote.created_on = temp_date.utc().format('{yyyy}-{MM}-{dd}T{HH}:{mm}:00.00000');
var createNote = Note.createNote($scope.newNote);
createNote.then(function(response_data){
console.log("Response from API");
console.log(response_data);
$scope.loadNotesPageData(1);
});
};
$scope.startEditNote = function(id){
var getEditNoteData = Note.getNote(id);
getEditNoteData.then(function(d){
$scope.editNote = d;
$scope.editNote.created_on = Date.utc.create($scope.editNote.created_on);
});
};
$scope.submitEditNote = function(){
var temp_date = Date.create($scope.editNote.created_on);
$scope.editNote.created_on = temp_date.utc().format('{yyyy}-{MM}-{dd}T{HH}:{mm}:00.00000');
var updateNote = Note.updateNote($scope.editNote);
updateNote.then(function(response_data){
console.log("Response from API");
console.log(response_data);
$scope.loadNotesPageData(1);
});
};
$scope.openDeleteNote = function(id){
var getDeleteNoteData = Note.getNote(id);
getDeleteNoteData.then(function(d){
$scope.deleteNote = d;
});
};
$scope.submitDeleteNote = function(){
var deleteSelectedNote = Note.deleteNote($scope.deleteNote._id);
deleteSelectedNote.then(function(data){
$scope.loadNotesPageData(1);
});
};
});

View File

@@ -0,0 +1,64 @@
poconsole.factory('Note',function($q, $http, $log){
var getNotesPage = function(page_number) {
var deferred = $q.defer();
$http.get('/api/notes?q={"order_by":[{"field":"created_on","direction":"desc"}]}&page=' + page_number).success(function(data) {
deferred.resolve(data);
});
return deferred.promise;
};
var getNote = function(id){
var deferred = $q.defer();
$http.get('/api/notes/' + id).success(function(data) {
deferred.resolve(data);
});
return deferred.promise;
};
var createNote = function(n){
var deferred = $q.defer();
var note_obj = {
'note_text': n.note_text,
'author': n.author,
'created_on': n.created_on
};
$http.post('/api/notes', note_obj).success(function(data){
deferred.resolve(data);
});
return deferred.promise;
};
var updateNote = function(n){
var deferred = $q.defer();
var note_obj = {
'note_text': n.note_text,
'author': n.author,
'created_on': n.created_on
};
$http.put('/api/notes/'+ n._id, data=note_obj).success(function(data){
deferred.resolve(data);
});
return deferred.promise;
};
var deleteNote = function(id){
var deferred = $q.defer();
var url = '/api/notes/' + id;
$http.delete(url).success(function(data) {
deferred.resolve({
data: data
});
});
return deferred.promise;
};
return {
getNotesPage: getNotesPage,
getNote: getNote,
createNote: createNote,
deleteNote: deleteNote,
updateNote: updateNote
};
});

View File

@@ -31,6 +31,9 @@ tagserver.config([
}).when('/events', {
templateUrl: '/templates/events.html',
controller: 'eventsCtrl'
}).when('/notes', {
templateUrl: '/templates/notes.html',
controller: 'notesCtrl'
}).when('/', {
templateUrl: '/templates/dashboard.html',
controller: 'dashboardCtrl'

View File

@@ -1,4 +1,4 @@
poconsole.controller('wellTestCtrl', function($scope, $route, $http, $routeParams, Page, WellTest) {
poconsole.controller('wellTestCtrl', function($scope, Page, WellTest) {
Page.setTitle('Well Tests');
Page.setPage('welltest');
@@ -10,7 +10,7 @@ poconsole.controller('wellTestCtrl', function($scope, $route, $http, $routeParam
d.objects[j].created_on = Date.create(d.objects[j].created_on + "Z", { fromUTC: true });
// console.log({'Date After':d.objects[j].created_on});
}
$scope.well_test_vals = d.objects;
$scope.notes = d.objects;
$scope.num_pages = d.total_pages;
$scope.page_list = [];
$scope.page_num = d.page;

View File

@@ -1,4 +1,4 @@
poconsole.factory('WellTest',function($q, $http, $log, dateConversion){
poconsole.factory('WellTest',function($q, $http, $log){
var getWellTestPage = function(page_number) {
var deferred = $q.defer();
$http.get('/api/well_test_vals?q={"order_by":[{"field":"created_on","direction":"desc"}]}&page=' + page_number).success(function(data) {

View File

@@ -0,0 +1,141 @@
<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 Note...</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="note_text">Note</label>
<textarea ng-model="newNote.note_text" class="form-control" id="note_text"></textarea>
</div>
<div class="form-group">
<label for="author">Author</label>
<input type="text" ng-model="newNote.author" class="form-control" id="author" />
</div>
<hr />
<div class="form-group">
<label for="created_on">Note Time</label>
<br />
<quick-datepicker id="created_on" ng-model='newNote.created_on'></quick-datepicker>
</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="submitNewNote();" data-dismiss="modal">Submit Note</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="note_text">Note</label>
<textarea ng-model="editNote.note_text" class="form-control" id="note_text"></textarea>
</div>
<div class="form-group">
<label for="author">Author</label>
<input type="text" ng-model="editNote.author" class="form-control" id="author" />
</div>
<hr />
<div class="form-group">
<label for="created_on">Note Time</label>
<br />
<quick-datepicker id="created_on" ng-model='editNote.created_on'></quick-datepicker>
</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="submitEditNote();" data-dismiss="modal">Submit Well Test Edits</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="modal fade" id="deleteModal">
<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">Are you sure?</h4>
</div>
<div class="modal-body">
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
<h3>Are you sure you want to delete the Note by {{deleteNote.author}} at {{deleteNote.created_on}}?</h3>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">NO!!!!!!</button>
<button type="button" class="btn btn-danger" ng-click="submitDeleteNote(deleteNote._id);" data-dismiss="modal">Yes, delete it!</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class='container'>
<div class="row">
<div class="col-md-12">
<h1>Notes</h1>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addModal">
New Note
</button>
<div ng-if="num_pages>1" style="text-align:center;">
<ul class="pagination">
<li>
<a ng-click="loadNotesPageData(page_num_prev)" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
<li ng-repeat="p in page_list" ng-class="{'active':p==page_num}"><a ng-click="loadNotesPageData(p)">{{p}}</a></li>
<li>
<a ng-click="loadNotesPageData(page_num_next)" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class='row'>
<div class='col-md-12'>
<table class="table table-striped">
<thead>
<tr>
<th>Date</th>
<th>Note</th>
<th>Author</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="n in notes_data">
<td nowrap>{{ n.created_on | date:'medium'}}</td>
<td nowrap>{{ n.note_text }}</td>
<td nowrap>{{ n.author }}</td>
<td><button data-toggle="modal" data-target="#editModal" ng-click="startEditNote(n._id)" class="btn btn-primary">Edit</button></td>
<td><button data-toggle="modal" data-target="#deleteModal" ng-click="openDeleteNote(n._id)" class="btn btn-danger">Delete</button></td>
</tr>
</tbody>
</table>
<div ng-if="notes_data.length==0" class="well" style="text-align:center">No stored notes yet.</div>
</div>
</div>
</div>

View File

@@ -224,6 +224,8 @@
</tr>
</tbody>
</table>
<div ng-if="well_test_vals.length==0" class="well" style="text-align:center">No stored notes yet.</div>
</div>
</div>
</div>

View File

@@ -166,40 +166,59 @@ def get_data(db_table, obj_id):
# print("testing {}: {} == {}".format(x, test_well_test[x], data_in_db[x]))
# self.assertTrue(test_well_test[x] == data_in_db[x])
class TestEvents(unittest.TestCase):
# class TestEvents(unittest.TestCase):
# def test_insert(self):
# # event_id = db.Column(db.Integer, db.ForeignKey('event_configs._id'))
# # event_type = db.Column(db.String(64))
# # event_condition = db.Column(db.String(64))
# test_analog_event = {
# 'event_id': 1,
# 'event_type': 'Alarm',
# 'event_condition': 'High Alarm'
# }
#
# id_added = insert_data("events", test_analog_event)
# print("Added event at _id {}".format(id_added))
#
# if id_added > 0:
# data_in_db = get_data("events", id_added)
# for x in test_analog_event:
# print("testing {}: {} == {}".format(x, test_analog_event[x], data_in_db[x]))
# self.assertTrue(test_analog_event[x] == data_in_db[x])
#
# test_bit_event = {
# 'event_id': 16,
# 'event_type': 'Info',
# 'event_condition': 'Unit Start'
# }
#
# id_added = insert_data("events", test_bit_event)
# print("Added event at _id {}".format(id_added))
#
# if id_added > 0:
# data_in_db = get_data("events", id_added)
# for x in test_bit_event:
# print("testing {}: {} == {}".format(x, test_bit_event[x], data_in_db[x]))
# self.assertTrue(test_bit_event[x] == data_in_db[x])
class TestWellTest(unittest.TestCase):
def test_insert(self):
# event_id = db.Column(db.Integer, db.ForeignKey('event_configs._id'))
# event_type = db.Column(db.String(64))
# event_condition = db.Column(db.String(64))
test_analog_event = {
'event_id': 1,
'event_type': 'Alarm',
'event_condition': 'High Alarm'
# note_text = db.Column(db.String(256))
# author = db.String(128)
test_note = {
'note_text': "THIS IS A TEST OF THE NOTE SYSTEM.",
'author': "Patrick F-ing McDonagh"
}
id_added = insert_data("events", test_analog_event)
print("Added event at _id {}".format(id_added))
id_added = insert_data("notes", test_note)
print("Added note at _id {}".format(id_added))
if id_added > 0:
data_in_db = get_data("events", id_added)
for x in test_analog_event:
print("testing {}: {} == {}".format(x, test_analog_event[x], data_in_db[x]))
self.assertTrue(test_analog_event[x] == data_in_db[x])
test_bit_event = {
'event_id': 16,
'event_type': 'Info',
'event_condition': 'Unit Start'
}
id_added = insert_data("events", test_bit_event)
print("Added event at _id {}".format(id_added))
if id_added > 0:
data_in_db = get_data("events", id_added)
for x in test_bit_event:
print("testing {}: {} == {}".format(x, test_bit_event[x], data_in_db[x]))
self.assertTrue(test_bit_event[x] == data_in_db[x])
data_in_db = get_data("notes", id_added)
for x in test_note:
print("testing {}: {} == {}".format(x, test_note[x], data_in_db[x]))
self.assertTrue(test_note[x] == data_in_db[x])