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

Commit c664fec

Browse files
committed
Merge pull request #9 from appirio-tech/feature/nested-states
Feature/nested states
2 parents 40d75f2 + 5e8b0fe commit c664fec

15 files changed

+491
-26
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: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,19 @@ 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
@@ -60,13 +65,18 @@ html
6065
script(src="topcoder.constants.js")
6166
script(src="topcoder.controller.js")
6267
script(src="topcoder.interceptors.js")
68+
script(src="topcoder.routes.js")
6369
script(src="account/account.module.js")
6470
script(src="layout/layout.module.js")
6571
script(src="peer-review/peer-review.module.js")
66-
script(src="filters/local-time.filter.js")
72+
script(src="sample/sample.module.js")
73+
script(src="blocks/exception/exception.module.js")
74+
script(src="blocks/logger/logger.module.js")
6775
script(src="account/account.routes.js")
76+
script(src="filters/local-time.filter.js")
6877
script(src="peer-review/peer-review.routes.js")
6978
script(src="peer-review/slideable.directive.js")
79+
script(src="sample/sample.routes.js")
7080
script(src="services/api.service.js")
7181
script(src="services/auth.service.js")
7282
script(src="services/authtoken.service.js")
@@ -78,12 +88,27 @@ html
7888
script(src="services/user.service.js")
7989
script(src="account/login/login.controller.js")
8090
script(src="account/register/register.controller.js")
91+
script(src="blocks/exception/exception-handler.provider.js")
92+
script(src="blocks/exception/exception.js")
93+
script(src="blocks/logger/logger.js")
94+
script(src="bower_components/lodash/lodash.js")
95+
script(src="bower_components/lodash/lodash.min.js")
96+
script(src="bower_components/angular/angular.js")
97+
script(src="bower_components/angular/angular.min.js")
98+
script(src="bower_components/angular/index.js")
99+
script(src="bower_components/restangular/Gruntfile.js")
100+
script(src="bower_components/restangular/karma.conf.js")
101+
script(src="bower_components/restangular/karma.underscore.conf.js")
81102
script(src="layout/header/header.controller.js")
82103
script(src="peer-review/completed-review/completed-review.controller.js")
104+
script(src="peer-review/edit-review/edit-review.controller.js")
83105
script(src="peer-review/readOnlyScorecard/readOnlyScorecard.controller.js")
84106
script(src="peer-review/review-status/review-status.controller.js")
85107
script(src="peer-review/review-status/review-status.filter.js")
86-
script(src="peer-review/edit-review/edit-review.controller.js")
108+
script(src="bower_components/restangular/dist/restangular.js")
109+
script(src="bower_components/restangular/dist/restangular.min.js")
110+
script(src="bower_components/restangular/test/restangularSpec.js")
111+
script(src="bower_components/restangular/src/restangular.js")
87112
//- endinject
88113
89114
// inject:templates.js

0 commit comments

Comments
 (0)