mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-20 01:18:21 +00:00
WI work
This commit is contained in:
@@ -0,0 +1 @@
|
||||
<ui-view layout-fill></ui-view>
|
||||
@@ -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 () {
|
||||
};
|
||||
}]
|
||||
});
|
||||
})();
|
||||
@@ -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');
|
||||
})();
|
||||
@@ -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>'
|
||||
});
|
||||
}
|
||||
]);
|
||||
})();
|
||||
@@ -0,0 +1,5 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
require('./core.js');
|
||||
})();
|
||||
@@ -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'));
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,6 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
require('./config.js');
|
||||
require('./login.js');
|
||||
})();
|
||||
@@ -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);
|
||||
}
|
||||
}]);
|
||||
})();
|
||||
@@ -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>
|
||||
@@ -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');
|
||||
Reference in New Issue
Block a user