<!DOCTYPE html>
<html ng-app="MainApp">
<head>
<script data-require="angular.js@1.5.8" data-semver="1.5.8" src="https://code.angularjs.org/1.5.8/angular.js"></script>
<script data-require="angular-route@*" data-semver="1.5.8" src="https://code.angularjs.org/1.5.8/angular-route.js"></script>
<link rel="stylesheet" href="css/style.css" />
<script src="js/site.js"></script>
<script src="js/app.js"></script>
<script src="js/appRoutes.js"></script>
<script src="js/MainController.js"></script>
<script src="js/UserController.js"></script>
<script src="js/github.js"></script>
</head>
<body>
<h1>Github Viewer</h1>
<div ng-view></div>
</body>
</html>
/* Styles go here */
.headshot {
max-width: 200px
}
.headshot-sm {
max-width: 100px
}
AngularJs: Get Started
Routing, $location, $routeParams
// MODULES
(function () {
"use strict";
angular.module("MainApp", ["ngRoute"]);
})();
// CONTROLLER : MainController
(function() {
"use strict";
// Create MainController in MainApp
angular.module("MainApp")
.controller("MainController", ["$scope", "$interval", "$location", MainController]);
function MainController($scope, $interval, $location) { //Controller
/* ****************************************************** */
/* Search for user */
/* ****************************************************** */
$scope.search = function(userName){
$scope.error = "";
$scope.user = {};
//Cancel interval
if(countDownInterval) {
$interval.cancel(countDownInterval);
$scope.countdown = null;
}
$location.path("/user/" + userName);
};
/* ****************************************************** */
/* CountDown */
/* ****************************************************** */
var decrementCountDown = function () {
$scope.countdown -= 1;
if($scope.countdown < 1) {
$scope.searchName = $scope.searchName? $scope.searchName : "angular";
$scope.search($scope.searchName);
}
};
var countDownInterval = null; // used to cancell interval is search is already executed
var startCountDown = function() {
countDownInterval = $interval(decrementCountDown, 1000, $scope.countdown);
};
/* ****************************************************** */
/* Initializations */
/* ****************************************************** */
$scope.countdown = 5;
$scope.searchName = "angular";
startCountDown();
}
})();
function changeSortOrder(current, newSort) {
if(!current && !newSort)
return "";
if(!current)
current = newSort;
if(!newSort)
mewSort = current;
var direction = current.slice(0, 1);
var name = current.replace("+", "").replace("-", "");
if (newSort == name && direction == "+")
return "-" + newSort;
else
return "+" + newSort;
}
<div>
<div>{{error}}</div>
<br/>
<div>
<div>Name: {{ user.name }}</div>
<div>Location: {{ user.location }}</div>
<div>
<img src="{{user.avatar_url}}" alt="user.name" class="headshot-sm">
</div>
</div>
<table>
<thead>
<tr>
<th><a ng-click="changeRepoSortOrder('name')">Name</a></th>
<th><a ng-click="changeRepoSortOrder('stargazers_count')">Stars</a></th>
<th><a ng-click="changeRepoSortOrder('language')">Language</a></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="repo in user.repos | orderBy:repoSortOrder ">
<!--orderBy:'-stargazers_count' -->
<td>{{ repo.name }}</td>
<td>{{ repo.stargazers_count | number }}</td>
<td>{{ repo.language }}</td>
</tr>
</tbody>
</table>
<div>
<a href="#/main"> Back to search</a>
</div>
</div>
// SERVICE - gitHub
(function () {
"use strict";
angular.module("MainApp")
.service("gitHub", ["$http", gitHub]);
function gitHub($http) {
var getUser = function (userName) {
return $http.get("https://api.github.com/users/" + userName)
.then(function(response){
return response.data;
});
};
var getRepos = function (user) {
return $http.get(user.repos_url)
.then(function (response){
return response.data;
});
};
return {
getUser: getUser,
getRepos: getRepos
};
}
})();
// ROUTES
(function () {
"use strict";
angular.module("MainApp").config(["$routeProvider", function ($routeProvider) {
$routeProvider
.when("/main", {
templateUrl: "main.html",
controller: "MainController"
})
.when("/user/:username", {
templateUrl: "user.html",
controller: "UserController"
})
.otherwise({
redirectTo: "/main"
});
}]);
})();
// CONTROLLERS
(function() {
"use strict";
// Create MainController in MainApp
angular.module("MainApp")
.controller("UserController", ["$scope", "gitHub", "$routeParams", UserController]);
function UserController($scope, gitHub, $routeParams) { //Controller
/* ****************************************************** */
/* User related functions */
/* ****************************************************** */
var onUserComplete = function(data){
$scope.user = data;
if($scope.user.name) {
gitHub.getRepos($scope.user)
.then(onRepos, onError);
}
else {
$scope.user = {};
$scope.error = "Invalid User Data";
}
};
var onRepos = function (data) {
$scope.user.repos = data;
};
var onError = function(reason) {
$scope.error = "Could not fetch data. Error: " + reason.data.message;
$scope.user = {};
};
/* ****************************************************** */
/* Sort functions */
/* ****************************************************** */
$scope.changeRepoSortOrder = function(orderBy) {
$scope.repoSortOrder = changeSortOrder($scope.repoSortOrder, orderBy);
};
/* ****************************************************** */
/* Initializations */
/* ****************************************************** */
$scope.repoSortOrder = "-stargazers_count";
$scope.searchName = $routeParams.username;
//Getting user
gitHub.getUser($scope.searchName)
.then(onUserComplete, onerror);
}
})();
<div>
<!-- View -->{{ countdown }}
<form name="searchUser" ng-submit="search(searchName)">
<input type="search" required="" placeholder="Username to find" ng-model="searchName" />
<input type="submit" value="Search" /> <span>{{searchName}}</span> </form>
</div>