Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit b8416aa

Browse files
author
Parth Shah
committed
adding nested header / footer views & login redirect
1 parent b731f1e commit b8416aa

15 files changed

+478
-23
lines changed

app/account/account.routes.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,33 @@
1010

1111
$stateProvider
1212
.state('login', {
13-
url: '/login',
14-
templateUrl: 'account/login/login.html'
13+
parent: 'root',
14+
url: '/login?next',
15+
data: {
16+
title: 'Login'
17+
},
18+
views: {
19+
'container@': {
20+
templateUrl: 'account/login/login.html',
21+
controller: 'LoginController'
22+
},
23+
'footer@': {
24+
// no footer
25+
template: ''
26+
}
27+
}
1528
})
1629
.state('register', {
17-
url: '/register',
18-
templateUrl: 'account/register/register.html'
30+
url: '/register?next',
31+
data: {
32+
title: "Join"
33+
},
34+
views: {
35+
'container@': {
36+
templateUrl: 'account/register/register.html',
37+
controller: 'RegisterController'
38+
}
39+
}
1940
});
2041

2142
$urlRouterProvider.otherwise('/login');

app/account/login/login.controller.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,24 @@
33

44
angular.module('tc.account').controller('LoginController', LoginController);
55

6-
LoginController.$inject = [];
6+
LoginController.$inject = ['$log', '$state', '$stateParams', 'auth', '$location'];
77

8-
function LoginController() {
8+
function LoginController($log, $state, $stateParams, auth, $location) {
99
var vm = this;
1010
vm.name = 'login';
11+
12+
// check if the user is already logged in
13+
if (auth.isAuthenticated()) {
14+
// redirect to next if exists else dashboard
15+
if ($stateParams.next) {
16+
$log.debug('Redirecting: ' + $stateParams.next);
17+
$log.debug($location.path());
18+
$location.path($stateParams.next);
19+
} else {
20+
// FIXME
21+
$state.go('sample.child1');
22+
}
23+
}
24+
1125
}
1226
})();
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Include in index.html so that app level exceptions are handled.
2+
// Exclude from testRunner.html which should run exactly what it wants to run
3+
(function () {
4+
'use strict';
5+
6+
angular
7+
.module('blocks.exception')
8+
.provider('exceptionHandler', exceptionHandlerProvider)
9+
.config(config);
10+
11+
/**
12+
* Must configure the exception handling
13+
* @return {[type]}
14+
*/
15+
function exceptionHandlerProvider() {
16+
/* jshint validthis:true */
17+
this.config = {
18+
appErrorPrefix: undefined
19+
};
20+
21+
this.configure = function (appErrorPrefix) {
22+
this.config.appErrorPrefix = appErrorPrefix;
23+
};
24+
25+
this.$get = function () {
26+
return {config: this.config};
27+
};
28+
}
29+
30+
config.$inject = ['$provide'];
31+
32+
/**
33+
* Configure by setting an optional string value for appErrorPrefix.
34+
* Accessible via config.appErrorPrefix (via config value).
35+
* @param {[type]} $provide
36+
* @return {[type]}
37+
* @ngInject
38+
*/
39+
function config($provide) {
40+
$provide.decorator('$exceptionHandler', extendExceptionHandler);
41+
}
42+
43+
extendExceptionHandler.$inject = ['$delegate', 'exceptionHandler', 'logger'];
44+
45+
/**
46+
* Extend the $exceptionHandler service to also display a toast.
47+
* @param {Object} $delegate
48+
* @param {Object} exceptionHandler
49+
* @param {Object} logger
50+
* @return {Function} the decorated $exceptionHandler service
51+
*/
52+
function extendExceptionHandler($delegate, exceptionHandler, logger) {
53+
return function (exception, cause) {
54+
var appErrorPrefix = exceptionHandler.config.appErrorPrefix || '';
55+
var errorData = {exception: exception, cause: cause};
56+
exception.message = appErrorPrefix + exception.message;
57+
$delegate(exception, cause);
58+
/**
59+
* Could add the error to a service's collection,
60+
* add errors to $rootScope, log errors to remote web server,
61+
* or log locally. Or throw hard. It is entirely up to you.
62+
* throw exception;
63+
*
64+
* @example
65+
* throw { message: 'error message we added' };
66+
*/
67+
logger.error(exception.message, errorData);
68+
};
69+
}
70+
})();
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/* jshint -W117, -W030 */
2+
describe('blocks.exception', function () {
3+
var exceptionHandlerProvider;
4+
var mocks = {
5+
errorMessage: 'fake error',
6+
prefix: '[TEST]: '
7+
};
8+
9+
beforeEach(function () {
10+
bard.inject('$rootScope');
11+
});
12+
13+
bard.verifyNoOutstandingHttpRequests();
14+
15+
describe('$exceptionHandler', function () {
16+
it('should have a dummy test', inject(function () {
17+
expect(true).to.equal(true);
18+
}));
19+
20+
it('should be defined', inject(function ($exceptionHandler) {
21+
expect($exceptionHandler).to.be.defined;
22+
}));
23+
24+
it('should have configuration', inject(function ($exceptionHandler) {
25+
expect($exceptionHandler.config).to.be.defined;
26+
}));
27+
28+
// describe('with appErrorPrefix', function () {
29+
// beforeEach(function () {
30+
// exceptionHandlerProvider.configure(mocks.prefix);
31+
// });
32+
33+
// it('should have exceptionHandlerProvider defined', inject(function () {
34+
// expect(exceptionHandlerProvider).to.be.defined;
35+
// }));
36+
37+
// it('should have appErrorPrefix defined', inject(function () {
38+
// expect(exceptionHandlerProvider.$get().config.appErrorPrefix).to.be.defined;
39+
// }));
40+
41+
// it('should have appErrorPrefix set properly', inject(function () {
42+
// expect(exceptionHandlerProvider.$get().config.appErrorPrefix)
43+
// .to.equal(mocks.prefix);
44+
// }));
45+
46+
// it('should throw an error when forced', inject(function () {
47+
// expect(functionThatWillThrow).to.throw();
48+
// }));
49+
50+
// it('manual error is handled by decorator', function () {
51+
// var exception;
52+
// exceptionHandlerProvider.configure(mocks.prefix);
53+
// try {
54+
// $rootScope.$apply(functionThatWillThrow);
55+
// }
56+
// catch (ex) {
57+
// exception = ex;
58+
// expect(ex.message).to.equal(mocks.prefix + mocks.errorMessage);
59+
// }
60+
// });
61+
// });
62+
});
63+
64+
function functionThatWillThrow() {
65+
throw new Error(mocks.errorMessage);
66+
}
67+
});

app/blocks/exception/exception.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(function () {
2+
'use strict';
3+
4+
angular
5+
.module('blocks.exception')
6+
.factory('exception', exception);
7+
8+
exception.$inject = ['logger'];
9+
10+
/* @ngInject */
11+
function exception(logger) {
12+
var service = {
13+
catcher: catcher
14+
};
15+
return service;
16+
17+
function catcher(message) {
18+
return function (reason) {
19+
logger.error(message, reason);
20+
};
21+
}
22+
}
23+
})();
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(function () {
2+
'use strict';
3+
4+
angular.module('blocks.exception', ['blocks.logger']);
5+
})();

app/blocks/logger/logger.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
(function () {
2+
'use strict';
3+
4+
angular
5+
.module('blocks.logger')
6+
.factory('logger', logger);
7+
8+
logger.$inject = ['$log'];
9+
10+
/* @ngInject */
11+
function logger($log) {
12+
var service = {
13+
showToasts: false,
14+
15+
error: error,
16+
info: info,
17+
success: success,
18+
warning: warning,
19+
20+
// straight to console; bypass toastr
21+
log: $log.log
22+
};
23+
24+
return service;
25+
/////////////////////
26+
27+
function error(message, data, title) {
28+
$log.error('Error: ' + message, data);
29+
}
30+
31+
function info(message, data, title) {
32+
$log.info('Info: ' + message, data);
33+
}
34+
35+
function success(message, data, title) {
36+
$log.info('Success: ' + message, data);
37+
}
38+
39+
function warning(message, data, title) {
40+
$log.warn('Warning: ' + message, data);
41+
}
42+
}
43+
}());

app/blocks/logger/logger.module.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(function () {
2+
'use strict';
3+
4+
angular.module('blocks.logger', []);
5+
})();

app/index.jade

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,29 @@ html
3030
3131
body(ng-app="topcoder", ng-controller="TopcoderController as main", ng-strict-di)
3232

33-
include ./layout/header/sidebar.jade
3433

35-
include ./layout/header/header.jade
34+
//- include ./layout/header/header.jade
35+
div(ui-view="header")
36+
37+
//- include ./layout/header/sidebar.jade
38+
div(ui-view="sidebar")
39+
3640

3741
.view-container(ng-class="{slided: main.sidebarActive}")
38-
div(ui-view, ng-class="$state.current.name")
42+
div(ui-view="container", ng-class="$state.current.name")
3943

40-
include ./layout/footer/footer.jade
44+
//- include ./layout/footer/footer.jade
45+
div(ui-view="footer")
4146

4247
// build:js js/vendor.js
4348
//- bower:js
4449
script(src='../bower_components/angular/angular.js')
50+
script(src="bower_components/lodash/lodash.min.js")
4551
script(src='../bower_components/angular-ui-router/release/angular-ui-router.js')
4652
script(src='../bower_components/angular-cookies/angular-cookies.js')
4753
script(src='../bower_components/angular-jwt/dist/angular-jwt.js')
4854
script(src='../bower_components/moment/moment.js')
55+
script(src="bower_components/restangular/dist/restangular.min.js")
4956
//- endbower
5057
//- inject:nonBowerScripts
5158
script(src="/scripts/auth0-1.6.4.js")
@@ -60,13 +67,18 @@ html
6067
script(src="account/account.module.js")
6168
script(src="layout/layout.module.js")
6269
script(src="peer-review/peer-review.module.js")
70+
script(src="sample/sample.module.js")
71+
script(src="blocks/exception/exception.module.js")
72+
script(src="blocks/logger/logger.module.js")
6373
script(src="topcoder.constants.js")
6474
script(src="topcoder.controller.js")
6575
script(src="topcoder.interceptors.js")
76+
script(src="topcoder.routes.js")
6677
script(src="account/account.routes.js")
6778
script(src="filters/local-time.filter.js")
6879
script(src="peer-review/peer-review.routes.js")
6980
script(src="peer-review/slideable.directive.js")
81+
script(src="sample/sample.routes.js")
7082
script(src="services/api.service.js")
7183
script(src="services/auth.service.js")
7284
script(src="services/authtoken.service.js")
@@ -78,6 +90,9 @@ html
7890
script(src="services/user.service.js")
7991
script(src="account/login/login.controller.js")
8092
script(src="account/register/register.controller.js")
93+
script(src="blocks/exception/exception-handler.provider.js")
94+
script(src="blocks/exception/exception.js")
95+
script(src="blocks/logger/logger.js")
8196
script(src="layout/header/header.controller.js")
8297
script(src="peer-review/completed-review/completed-review.controller.js")
8398
script(src="peer-review/edit-review/edit-review.controller.js")

app/peer-review/peer-review.routes.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,40 @@
1111
function routes($stateProvider, $urlRouterProvider, $httpProvider) {
1212
var name, state, states;
1313
states = {
14-
reviewStatus: {
14+
review: {
15+
abstract: true,
16+
parent: 'root',
17+
template: '<div ui-view></div>',
18+
data: {
19+
authRequired: true,
20+
}
21+
},
22+
'reviewStatus': {
23+
parent: 'review',
1524
url: '/challenge/:challengeId',
1625
templateUrl: 'peer-review/review-status/review-status.html',
1726
controller: 'ReviewStatusController',
18-
authenticate: true
27+
data: {
28+
title: 'Peer Review'
29+
}
1930
},
20-
readOnlyScorecard: {
31+
'readOnlyScorecard': {
32+
parent: 'review',
2133
url: '/scorecard/:scorecardId',
2234
templateUrl: 'peer-review/readOnlyScorecard/readOnlyScorecard.html',
2335
controller: 'ReadOnlyScorecardController'
2436
},
25-
completed: {
37+
'completed': {
38+
parent: 'review',
2639
url: '/:challengeId/reviews/:reviewId/completed',
2740
templateUrl: 'peer-review/completed-review/completed-review.html',
2841
controller: 'CompletedReviewController',
29-
authenticate: true
3042
},
31-
edit: {
43+
'edit': {
44+
parent: 'review',
3245
url: '/:challengeId/reviews/:reviewId/edit',
3346
templateUrl: 'peer-review/edit-review/edit-review.html',
3447
controller: 'EditReviewController',
35-
authenticate: true
3648
}
3749
};
3850
for (name in states) {

0 commit comments

Comments
 (0)