Completes POCONSOLE-67. Users can now compare multiple cards.

This commit is contained in:
Patrick McDonagh
2016-11-30 16:44:49 -06:00
parent 959b01aff5
commit 68f0007055
5 changed files with 255 additions and 33 deletions

View File

@@ -1,9 +1,10 @@
poconsole.controller('cardListCtrl', function($scope, $routeParams, Card, Page) {
poconsole.controller('cardListCtrl', function($scope, $window, $routeParams, Card, Page) {
Page.setTitle('Card List');
Page.setPage('cards');
var multipleCardList = [];
$scope.checkStatus = false;
var getDateList = Card.getCardDates();
getDateList.then(function(dates) {
console.log(dates);
$scope.dates = dates;
var date_param;
@@ -39,6 +40,22 @@ poconsole.controller('cardListCtrl', function($scope, $routeParams, Card, Page)
$scope.date_param = date_p;
});
};
$scope.addCardToMultiple = function(card_id){
var mcl_index = multipleCardList.indexOf(parseInt(card_id));
var inMultiple = mcl_index != -1;
if (!inMultiple){
multipleCardList.push(parseInt(card_id));
} else {
multipleCardList.splice(mcl_index, 1);
}
};
$scope.compareMultipleCards = function(){
if (multipleCardList.length > 1){
$window.location.href = '/#/multiplecards/' + multipleCardList.join(',');
}
};
});
poconsole.controller('cardDataCtrl', function($scope, $routeParams, Card, Page, Tag) {
@@ -48,22 +65,6 @@ poconsole.controller('cardDataCtrl', function($scope, $routeParams, Card, Page,
var getDateList = Card.getCardDates();
getDateList.then(function(dates) {
$scope.dates = dates;
//TODO: ADD CURRENT DATE DETECTION
// $scope.currentDate = $scope.dates[0];
var date_param;
if (!$routeParams.date_param){
date_param = dates[dates.length - 1].ind;
} else {
date_param = $routeParams.date_param;
}
var page;
if (!$routeParams.page){
page = 1;
} else {
page = $routeParams.page;
}
});
@@ -113,3 +114,54 @@ poconsole.controller('cardDataCtrl', function($scope, $routeParams, Card, Page,
});
});
});
poconsole.controller('multipleCardDataCtrl', function($scope, $routeParams, Card, Page, Tag) {
Page.setTitle('Card Data');
Page.setPage('cards');
var getDateList = Card.getCardDates();
getDateList.then(function(dates) {
$scope.dates = dates;
});
var makeCard = function(position_array, load_array){
/**
* [makes makes an array of {load:x, position:y} objects]
* @position_array {[array]}
* @load_array {{array}}
*/
return position_array.map(function(a, i){
return {position:position_array[i], load:load_array[i]};
});
};
var getCards = Card.getMultipleCards($routeParams.cardIDs.split(','));
getCards.then(function(cData){
$scope.card_graph_data = {};
$scope.cards = [];
for(var i = 0; i < cData.length; i++){
var card = {};
card.stroke_time = new Date(cData[i].created_on);
card.stroke_number = cData[i].stroke_number;
card._id = cData[i]._id;
card.stroke_type = cData[i].stroke_type;
var surf_pos = JSON.parse(cData[i].surf_pos);
var surf_lod = JSON.parse(cData[i].surf_lod);
var down_pos = JSON.parse(cData[i].down_pos);
var down_lod = JSON.parse(cData[i].down_lod);
var surface_card = makeCard(surf_pos, surf_lod);
var downhole_card = makeCard(down_pos, down_lod);
$scope.cards.push(card);
$scope.card_graph_data['surface_' + cData[i]._id] = surface_card;
$scope.card_graph_data['downhole_' + cData[i]._id] = downhole_card;
}
console.log($scope.cards);
var graphOptions = Card.getCardGraphOptionsMultiple($scope.card_graph_data);
$scope.surfaceOptions = graphOptions.surf;
$scope.downholeOptions = graphOptions.down;
});
});

View File

@@ -27,6 +27,15 @@ poconsole.factory('Card', function($q, $http, $log){
return deferred.promise;
};
service.getMultipleCards = function(card_list){
var url = '/api/cards?q={"filters":[{"name":"_id","op":"in","val":"' + card_list.join(',') + '"}]}';
var deferred = $q.defer();
$http.get(url).success(function(data){
deferred.resolve(data.objects);
});
return deferred.promise;
};
service.getLatestCard = function(){
var deferred = $q.defer();
$http.get('/api/cards?q={"order_by":[{"field":"created_on","direction":"desc"}], "limit":1}').success(function(data) {
@@ -66,14 +75,14 @@ poconsole.factory('Card', function($q, $http, $log){
},
series: [
{
axis:"y",
key: 'load',
dataset: 'surface',
color: 'steelblue',
type: ['line', 'area'],
striped: true,
label: 'Surface Card',
id: "surfaceCard"
axis:"y",
key: 'load',
dataset: 'surface',
color: 'steelblue',
type: ['line', 'area'],
striped: true,
label: 'Surface Card',
id: "surfaceCard"
}
],
grid: {
@@ -94,10 +103,10 @@ poconsole.factory('Card', function($q, $http, $log){
ticks: 7
},
y: {
type: 'linear',
min: limits.dMinLoad,
max: limits.dMaxLoad,
ticks: 5
type: 'linear',
min: limits.dMinLoad,
max: limits.dMaxLoad,
ticks: 5
}
},
series: [
@@ -119,6 +128,111 @@ poconsole.factory('Card', function($q, $http, $log){
return({surf: surfaceOptions, down: downholeOptions});
};
service.getCardGraphOptionsMultiple = function(graph_data){
var colors = ['#d7191c','#fdae61','#abdda4','#2b83ba'];
var surfaceData = [];
var downholeData = [];
var allSurface = [];
var allDownhole = [];
Object.keys(graph_data).forEach(function(card_part){
var card_params = card_part.split("_");
if (card_params[0] == "surface"){
surfaceData[parseInt(card_params[1])] = graph_data[card_part];
Array.prototype.push.apply(allSurface, graph_data[card_part]);
} else if (card_params[0] == "downhole") {
downholeData[parseInt(card_params[1])] = graph_data[card_part];
Array.prototype.push.apply(allDownhole, graph_data[card_part]);
}
});
var limits = {
sMaxPos: allSurface.map(function(x){return x.position;}).reduce(function(y,z){return Math.max(y,z);})+ 20,
sMinPos: allSurface.map(function(x){return x.position;}).reduce(function(y,z){return Math.min(y,z);})- 20,
sMaxLoad: allSurface.map(function(x){return x.load;}).reduce(function(y,z){return Math.max(y,z);})+ 2000,
sMinLoad: allSurface.map(function(x){return x.load;}).reduce(function(y,z){return Math.min(y,z);})- 2000,
dMaxLoad: allDownhole.map(function(x){return x.load;}).reduce(function(y,z){return Math.max(y,z);})+ 2000,
dMinLoad: allDownhole.map(function(x){return x.load;}).reduce(function(y,z){return Math.min(y,z);})- 2000,
};
var surfaceOptions = {
axes: {
x: {
key: 'position',
labelFunction: function(value) {
return value;
},
type: 'linear',
min: limits.sMinPos,
max: limits.sMaxPos,
ticks: 7
},
y: {
type: 'linear',
min: limits.sMinLoad,
max: limits.sMaxLoad,
ticks: 5
}
},
series: [],
grid: {
x: true,
y: true
}
};
Object.keys(surfaceData).forEach(function(s_card){
var s_ser = {
axis:"y",
key: 'load',
dataset: 'surface_' + s_card.toString(),
color: colors[ parseInt(s_card) % colors.length],
type: ['line'],
label: "Stroke " + s_card.toString(),
id: "surfaceCard" + s_card.toString()
};
surfaceOptions.series.push(s_ser);
});
var downholeOptions = {
axes: {
x: {
key: 'position',
labelFunction: function(value) {
return value;
},
type: 'linear',
min: limits.sMinPos,
max: limits.sMaxPos,
ticks: 7
},
y: {
type: 'linear',
min: limits.dMinLoad,
max: limits.dMaxLoad,
ticks: 5
}
},
series: [],
grid: {
x: true,
y: true
}
};
Object.keys(downholeData).forEach(function(d_card){
var d_ser = {
axis:"y",
key: 'load',
dataset: 'downhole_' + d_card.toString(),
color: colors[ parseInt(d_card) % colors.length],
type: ['line'],
label: "Stroke " + d_card.toString(),
id: "downholeCard" + d_card.toString()
};
downholeOptions.series.push(d_ser);
});
return {surf: surfaceOptions, down: downholeOptions};
};
return service;
});

View File

@@ -43,6 +43,9 @@ tagserver.config([
}).when('/latest_stroke', {
templateUrl: '/templates/latestcard.html',
controller: 'latestStrokeCtrl'
}).when('/multiplecards/:cardIDs', {
templateUrl: '/templates/multiplecards.html',
controller: 'multipleCardDataCtrl'
}).when('/', {
templateUrl: '/templates/dashboard.html',
controller: 'dashboardCtrl'

View File

@@ -14,7 +14,7 @@
</div>
<div class="row">
<button class="btn btn-primary" ng-click="selectcards()">Compare Multiple Cards</button>
<button class="btn btn-primary" ng-click="compareMultipleCards()">Compare Multiple Cards</button>
</div>
<div ng-if="loading" class="well">
<h1>Loading Cards...</h1>
@@ -33,8 +33,8 @@
<tbody>
<tr dir-paginate="card in cards | itemsPerPage:per_page" total-items="total" current-page="page_num">
<td style="vertical-align: middle;text-align:center;"><input type="checkbox" ng-model="card.selected"></a></td>
<td style="vertical-align: middle;text-align:center;"><a href="/#/cards/{{card._id}}">{{card.created_on | date: "medium"}}</a></td>
<td style="vertical-align: middle;text-align:center;"><input type="checkbox" ng-change="addCardToMultiple(card._id)" ng-model="checkStatus"></td>
<td style="vertical-align: middle;text-align:center;"><a href="/#/cards/{{card._id}}">{{card.created_on | date: "medium"}}</td>
<!-- <td style="vertical-align: middle;text-align:center;">{{card.Fillage_Percent | number: 2}} %</td> -->
<td style="vertical-align: middle;text-align:center;"><h5><span class="label" ng-class="{'label-success':card.stroke_type=='Normal', 'label-primary': card.stroke_type=='Shutdown', 'label-danger': card.stroke_type=='Alarm', 'label-warning':card.stroke_type=='Low Fillage'}">{{card.stroke_type}}</span></h5></td>
<td style="vertical-align: middle;text-align:center;"><a href="/api/csv_stroke/{{card._id}}" class="btn btn-primary active">Download CSV</a></td>

View File

@@ -0,0 +1,53 @@
<div class="container">
<div class="row">
<div class="col-sm-2">
<ul class="list-group">
<li class="list-group-item animate" ng-repeat="date in dates" ng-class="{'active':date.ind==current_date}">
<a ng-if="date.ind!=current_date" href="/#/cards/{{date.ind}}">{{date.dtime | date: 'EEE. MMM. d yyyy'}}</a>
<span ng-if="date.ind==current_date">{{date.dtime | date: 'EEE. MMM. d yyyy'}}</span>
</li>
</ul>
</div>
<div class="col-sm-10 pull-right">
<div ng-if="loading" class="well"><img src="/img/loading.gif" style="display: table-cell; vertical-align: middle"/></div>
<div ng-if="!loading">
<div class="row">
<div class="col-sm-12">
<h1>Surface Card</h1>
<div class="surfaceCard tagChart" style="height:500px">
<linechart data="card_graph_data" options="surfaceOptions"></linechart>
</div>
</div>
<div class="col-sm-12">
<h1>Downhole Card</h1>
<div class="downholeCard tagChart" style="height:500px">
<linechart data="card_graph_data" options="downholeOptions"></linechart>
</div>
</div>
<div class="col-sm-12">
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>Date & Time</th>
<th>Stroke Type</th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="card in cards">
<td>{{card.stroke_time | date: 'medium'}}</td>
<td>{{card.stroke_type}}</td>
<td><a href="/#/cards/{{card._id}}" class="btn btn-primary">View Card</a></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>