<!DOCTYPE html>
<html lang="en-US" ng-app="myApp">
<head>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://unpkg.com/angular-toastr@2.1.1/dist/angular-toastr.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.7/angular.min.js"></script>
<script src="https://unpkg.com/angular-toastr@2.1.1/dist/angular-toastr.tpls.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/ui-bootstrap4@3.0.5/dist/ui-bootstrap-tpls-3.0.5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.2.1/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-chart.js/1.1.1/angular-chart.min.js"></script>
<script src="script.js"></script>
<script src="submit.js"></script>
</head>
<body ng-controller="MyCtrl">
<!-- SHOW / HIDE -->
<ng-container>
<!-- TABLES, FILTERING, AND PAGINATION -->
<div class="container rounded bg-light p-5">
<input type="text" class="form-control my-3" placeholder="Filter..." ng-model="filterText">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<th ng-repeat="key in labels">
<a href="#" ng-click="sortColumn(key)">
<span class="text-uppercase">{{key}}</span>
<span ng-show="orderByField == key">
<span ng-show="!sortByDescending">
<i class="fas fa-angle-up"></i>
</span>
<span ng-show="sortByDescending">
<i class="fas fa-angle-down"></i>
</span>
</span>
</a>
</th>
</tr>
</thead>
<tbody>
<tr ng-click="openModal(item)" ng-repeat="item in filterData = (data | filter: filterText | orderBy : orderByField : sortByDescending) | limitTo:itemsPerPage:itemsPerPage*(currentPage-1)" ng-class="{ 'text-white bg-info': item == selected }">
<td class="text-underline cursor-pointer" ng-repeat="key in labels">{{item[key]}}</td>
</tr>
</tbody>
</table>
</div>
<ul class="d-flex justify-content-center" uib-pagination total-items="filterData.length" items-per-page="5" ng-model="currentPage" max-size="5" boundary-link-numbers="3" ng-change="pageChanged()"></ul>
</div>
</ng-container>
<!-- MODAL -->
<script type="text/ng-template" id="myModalContent.html">
<div class="modal-header">
<h3 class="modal-title" id="modal-title">I'm a modal!</h3>
</div>
<div class="modal-body" id="modal-body">
<!-- ANGULAR CHARTS -->
<div class="container rounded bg-light p-5">
<canvas id="bar" class="chart chart-bar"
chart-data="data" chart-labels="labels" chart-series="series">
</canvas>
</div>
<div class="modal-footer">
<button class="btn btn-primary" type="button" ng-click="ok()">OK</button>
<button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
</div>
</script>
</body>
</html>
var app = angular.module('myApp', ['toastr', 'ui.bootstrap', 'chart.js']);
app.controller('MyCtrl', function(
$scope,
$http,
toastr,
$log,
$document,
$uibModal
) {
$scope._ = _;
$scope.labels = [];
$scope.data = [];
// Table & Pagination
// PAGINATION
$scope.currentPage = 1;
$scope.itemsPerPage = 5;
// Selection
$scope.selected = undefined;
$scope.pageChanged = function() {
console.log($scope.currentPage);
};
$scope.sortColumn = function(key) {
$scope.orderByField = key;
$scope.sortByDescending = !$scope.sortByDescending;
}
// HTTP GET
$scope.getData = function() {
$http.get('https://s3-us-west-2.amazonaws.com/s.cdpn.io/656755/subway.json').then(
response => {
$scope.data = response.data.subwayData;
$scope.labels = _.keys($scope.data[0]);
// Table Sorting
$scope.sortColumn($scope.labels[0]);
toastr.success("Data populated", 'Success');
},
error => {
toastr.error('Data not populated', 'Error');
}
);
};
// Temporary Use this instead of calling
$scope.getData();
// Modal
$scope.openModal = function(selected) {
$scope.selected = selected;
const filtered = $scope.data.filter(item => {
return item.STATION === selected.STATION;
});
var modalInstance = $uibModal.open({
animation: true,
ariaLabelledBy: 'modal-title',
ariaDescribedBy: 'modal-body',
templateUrl: 'myModalContent.html',
controller: 'ModalInstanceCtrl',
resolve: {
selected: function() {
return filtered;
},
},
});
// Modal Instance
modalInstance.result.then(
function(selected) {
$scope.selected = selected;
toastr.success('Modal Closed', 'Success');
},
function() {
// toastr.error('Modal Cancelled', 'Error');
}
);
};
});
// Modal Instance
app.controller('ModalInstanceCtrl', function(
$uibModalInstance,
selected,
$scope
) {
// Angular-Chart.js
selected = _.orderBy(selected, ['TIMESTAMP'], ['asc']);
$scope.labels = _.map(selected, (item) => item.TIMESTAMP);
$scope.series = ['ENTRIES', 'EXITS'];
$scope.data = [
_.map(selected, (item) => item.ENTRIES),
_.map(selected, (item) => item.EXITS),
];
$scope.selected = selected;
$scope.ok = function() {
$uibModalInstance.close($scope.selected);
};
$scope.cancel = function() {
$uibModalInstance.dismiss('cancel');
};
});
/* Styles go here */