Completes POCONSOLE-48. Notes page working.
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
93
flask/app/static/js/notes.controller.js
Normal file
93
flask/app/static/js/notes.controller.js
Normal 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);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
64
flask/app/static/js/notes.factory.js
Normal file
64
flask/app/static/js/notes.factory.js
Normal 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
|
||||
};
|
||||
});
|
||||
@@ -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'
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
141
flask/app/static/templates/notes.html
Normal file
141
flask/app/static/templates/notes.html
Normal 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">×</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">×</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">×</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">«</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">»</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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user