This commit is contained in:
KimLS
2017-01-22 22:26:34 -08:00
parent cd4d79c02b
commit 40edbc3b64
48 changed files with 82834 additions and 9 deletions
+1
View File
@@ -0,0 +1 @@
<ui-view layout-fill></ui-view>
+15
View File
@@ -0,0 +1,15 @@
(function() {
'use strict';
var app = angular.module('app');
app.component('appRoot', {
templateUrl: 'app/app.html',
controller: ['$state', function($state) {
var self = this;
this.$onInit = function () {
};
}]
});
})();
View File
+6
View File
@@ -0,0 +1,6 @@
(function() {
'use strict';
require('./login/login.js');
require('./portal/portal.js');
})();
@@ -0,0 +1,24 @@
<md-content layout-fill layout="column" layout-align="start center">
<h2 class="login-title">Login</h2>
<form layout="column" class="md-whiteframe-4dp login-panel" ng-submit="$ctrl.doLogin()">
<md-input-container class="md-block">
<label>Username</label>
<input name="username" required ng-model="$ctrl.username" ng-disabled="$ctrl.loggingIn" aria-label="Username">
</md-input-container>
<md-input-container class="md-block">
<label>Password</label>
<input type="password" name="password" required ng-model="$ctrl.password" ng-disabled="$ctrl.loggingIn" aria-label="Password">
</md-input-container>
<div layout="row">
<md-checkbox ng-model="$ctrl.rememberMe" ng-disabled="$ctrl.loggingIn" aria-label="Remember Me">Remember Me</md-checkbox>
</div>
<span class="login-error-message" ng-show="$ctrl.error">
Unauthorized login.
</span>
<md-button type="submit" class="md-raised md-primary" ng-disabled="!$ctrl.canLogin()">Login</md-button>
</form>
</md-content>
@@ -0,0 +1,52 @@
(function() {
'use strict';
var app = angular.module('app');
app.component('login', {
templateUrl: 'app/components/login/login.html',
controller: ['$state', 'appConfig', 'loginState', '$http', function($state, appConfig, loginState, $http) {
var self = this;
self.username = '';
self.password = '';
self.rememberMe = false;
self.doLogin = doLogin;
self.canLogin = canLogin;
self.loggingIn = false;
self.error = false;
function doLogin() {
if(!canLogin()) {
return;
}
self.loggingIn = true;
self.error = false;
var data = { username: self.username, password: self.password };
$http.post(appConfig.config.api_url + '/api/token', data)
.then(function(response) {
self.loggingIn = false;
loginState.login(self.username, response.data, self.rememberMe);
}, function(response) {
self.loggingIn = false;
self.error = true;
});
}
function canLogin() {
if(self.username.length === 0 || self.password.length === 0 || self.loggingIn) {
return false;
}
return true;
}
self.$onInit = function () {
//If logged in just goto the next state
if(loginState.isLoggedIn()) {
$state.go(loginState.nextState, loginState.nextStateParams);
};
};
}]
});
})();
@@ -0,0 +1,16 @@
.login-panel
{
width: 400px;
padding: 28px;
}
.login-title
{
margin: 3em 0 3em 0;
}
.login-error-message
{
color: rgba(255, 40, 40, 200);
padding: 8px;
}
@@ -0,0 +1,26 @@
<md-content layout-fill>
<md-toolbar class="md-hue-2">
<div class="md-toolbar-tools">
<md-button class="md-icon-button" aria-label="menu">
<md-icon class="mdi mdi-menu mdi-24px"></md-icon>
</md-button>
<h2>
<span>EQEmu WI Portal</span>
</h2>
<span flex></span>
<md-menu md-offset="-20 -20">
<md-button class="md-icon-button" aria-label="More" ng-click="$ctrl.openMenu($mdOpenMenu, $event)">
<md-icon md-menu-origin class="mdi mdi-dots-vertical mdi-24px"></md-icon>
</md-button>
<md-menu-content width="4">
<md-menu-item>
<md-button ng-click="$ctrl.logout($event)">
<md-iconclass="mdi mdi-power mdi-24px" md-menu-align-target></md-icon>
Logout
</md-button>
</md-menu-item>
</md-menu-content>
</md-menu>
</div>
</md-toolbar>
</md-content>
@@ -0,0 +1,39 @@
(function() {
'use strict';
var app = angular.module('app');
app.component('portal', {
templateUrl: 'app/components/portal/portal.html',
controller: ['$state', '$mdDialog', 'loginState', function($state, $mdDialog, loginState) {
var self = this;
self.openMenu = openMenu;
self.logout = logout;
function openMenu($mdOpenMenu, ev) {
self.originatorEv = ev;
$mdOpenMenu(ev);
};
function logout(ev) {
var confirm = $mdDialog.confirm()
.title('Logout')
.textContent('Are you sure you wish to logout?')
.ariaLabel('Logout')
.targetEvent(ev)
.ok('Logout')
.cancel('Cancel');
$mdDialog.show(confirm).then(function() {
loginState.logout();
$state.go('login');
}, function() {
});
}
self.$onInit = function () {
};
}]
});
})();
@@ -0,0 +1,24 @@
(function(){
'use strict';
var app = angular.module('app');
app.factory('applyAuthIntercept', ['$injector', function($injector) {
return {
request: function(config) {
if(config.anonOnly) {
return config;
}
if(!config.headers) {
config.headers = { };
}
var loginState = $injector.get('loginState');
config.headers.Authorization = 'Bearer ' + loginState.token;
return config;
}
};
}]);
})();
@@ -0,0 +1,25 @@
(function(){
'use strict';
var app = angular.module('app');
app.factory('checkAuthIntercept', ['$q', '$injector', function($q, $injector) {
return {
responseError: function(response) {
if(response.status === 401) {
var $state = $injector.get('$state');
var loginState = $injector.get('loginState');
if($state.current.name !== 'login') {
loginState.nextState = $state.current.name;
loginState.nextStateParams = {};
loginState.logout();
$state.go('login');
}
}
return $q.reject(response);
}
};
}]);
})();
@@ -0,0 +1,6 @@
(function() {
'use strict';
require('./apply-auth.js');
require('./check-auth.js');
})();
+21
View File
@@ -0,0 +1,21 @@
(function() {
'use strict';
var app = angular.module('app');
app.config(['$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/login');
$stateProvider.state('login', {
url: '/login',
template: '<login></login>'
});
$stateProvider.state('portal', {
url: '/portal',
template: '<portal></portal>'
});
}
]);
})();
+5
View File
@@ -0,0 +1,5 @@
(function() {
'use strict';
require('./core.js');
})();
+10
View File
@@ -0,0 +1,10 @@
(function() {
'use strict';
var fs = require('fs');
var app = angular.module('app');
app.service('appConfig', function() {
this.config = JSON.parse(fs.readFileSync(__dirname + '/../../../config.json', 'utf8'));
});
})();
+6
View File
@@ -0,0 +1,6 @@
(function() {
'use strict';
require('./config.js');
require('./login.js');
})();
+78
View File
@@ -0,0 +1,78 @@
(function() {
'use strict';
var app = angular.module('app');
app.service('loginState', ['$rootScope', '$http', '$httpParamSerializer', '$state', '$localStorage', '$sessionStorage',
function($rootScope, $http, $httpParamSerializer, $state, $localStorage, $sessionStorage) {
var self = this;
self.isLoggedIn = isLoggedIn;
self.logout = logout;
self.login = login;
self.nextState = 'portal';
self.nextStateParams = { };
self.token = '';
function isLoggedIn() {
var storage_bucket = null;
var token = null;
if($localStorage.token) {
storage_bucket = $localStorage;
token = $localStorage.token;
} else if($sessionStorage.token) {
storage_bucket = $sessionStorage;
token = $sessionStorage.token;
}
if(token) {
var expires = storage_bucket.expires;
var username = storage_bucket.username;
var expire_date = new Date(expires);
var current_date = new Date();
if(current_date > expire_date) {
self.logout();
} else {
self.token = token;
self.expires = expires;
self.username = username;
return true;
}
}
return false;
}
function logout() {
delete $localStorage.token;
delete $localStorage.expires;
delete $localStorage.username;
delete $sessionStorage.token;
delete $sessionStorage.expires;
delete $sessionStorage.username;
self.wasLoggedInAs = self.username;
self.username = null;
self.token = null;
self.expires = null;
}
function login(username, loginObj, rememberMe) {
self.username = username;
self.token = loginObj.token;
self.expires = loginObj.expires;
if(rememberMe) {
$localStorage.username = self.username;
$localStorage.token = self.token;
$localStorage.expires = self.expires;
} else {
$sessionStorage.username = self.username;
$sessionStorage.token = self.token;
$sessionStorage.expires = self.expires;
}
$state.go(self.nextState, self.nextStateParams);
}
}]);
})();
+19
View File
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="Web portal for EQEmu WI Front">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>EQEmu WI Front</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700">
<link rel="stylesheet" href="css/vendor.css">
<link rel="stylesheet" href="css/app.css">
</head>
<body>
<app-root>Loading...</app-root>
<script type="text/javascript" src="js/bundle.js"></script>
<script type="text/javascript" src="js/templates.js"></script>
</body>
</html>
+35
View File
@@ -0,0 +1,35 @@
var angular = require('angular');
require('angular-material');
require('angular-ui-router');
require('angular-loading-bar');
require('angular-animate');
require('ngstorage');
var app = angular.module('app', ['ngMaterial', 'ui.router', 'angular-loading-bar', 'ngAnimate' ,'ngStorage', 'templates']);
app.config(['$sceDelegateProvider', 'cfpLoadingBarProvider', '$animateProvider', '$compileProvider', '$localStorageProvider', '$sessionStorageProvider', '$httpProvider',
function($sceDelegateProvider, cfpLoadingBarProvider, $animateProvider, $compileProvider, $localStorageProvider, $sessionStorageProvider, $httpProvider) {
$sceDelegateProvider.resourceUrlWhitelist([
'self'
]);
$animateProvider.classNameFilter(/^((?!(fa-spinner|fa-cog|fa-refresh|fa-circle-o-notch)).)*$/);
$compileProvider.preAssignBindingsEnabled(true);
$localStorageProvider.setKeyPrefix('eqemu_wi_');
$sessionStorageProvider.setKeyPrefix('eqemu_wi_');
$httpProvider.interceptors.push('applyAuthIntercept');
$httpProvider.interceptors.push('checkAuthIntercept');
}]);
angular.element(function() {
angular.bootstrap(document, ['app']);
});
require('./app/app.js');
require('./app/services');
require('./app/routes');
require('./app/components');
require('./app/interceptors');
View File