diff --git a/app/templates/bower.json b/app/templates/bower.json index 4b604d2c..00b4456d 100644 --- a/app/templates/bower.json +++ b/app/templates/bower.json @@ -3,19 +3,19 @@ "version": "0.0.0", "dependencies": { "jquery": "~2.1.4", - "angular": "~1.4.4", + "angular": "~1.5.x", "angular-bootstrap": "^1.1", - "angular-cookies": "~1.4.4", - "angular-highlightjs": "~0.4.3", - "angular-mocks": "~1.4.4", - "angular-ui-router": "~0.2.15", + "angular-cookies": "~1.5.x", + "angular-highlightjs": "^0.6.1", + "angular-mocks": "~1.5.x", + "angular-ui-router": "^1.0.0", "angular-ui-tinymce": "~0.0.9", - "angular-animate": "~1.4.4", + "angular-animate": "~1.5.x", "ngtoast": "^2.0.0", "angular-x2js": "https://github.com/janmichaelyu/angular-x2js.git", "bootstrap": "~3.3.5", "font-awesome": "~4.6.0", - "highlightjs":"~8.7.0", + "highlightjs": "~8.7.0", "lodash": "~3.10.1", "ml-search-ng": "~0.2.0", "ml-utils": "withjam/ml-utils", @@ -27,16 +27,19 @@ }, "overrides": { "angular-highlightjs": { - "dependencies": {"angular" : ">1.0.8", "highlightjs":"~8.7.0"} + "dependencies": { + "angular": ">1.0.8", + "highlightjs": "~8.7.0" + } } }, "devDependencies": { - "angular-mocks": "~1.4.4", + "angular-mocks": "~1.5.x", "sinon": "http://sinonjs.org/releases/sinon-1.16.1.js", "bardjs": "~0.1.8" }, "private": true, "resolutions": { - "angular": "~1.4.4" + "angular": "~1.5.x" } } diff --git a/app/templates/ui/app/create/create.component.js b/app/templates/ui/app/create/create.component.js new file mode 100644 index 00000000..e0722f6b --- /dev/null +++ b/app/templates/ui/app/create/create.component.js @@ -0,0 +1,11 @@ +(function() { + 'use strict'; + + angular.module('app.create') + .component('create', { + bindings: {}, + controller: 'CreateCtrl', + templateUrl: 'app/create/create.html' + }); + +}()); diff --git a/app/templates/ui/app/create/create.html b/app/templates/ui/app/create/create.html index e2f6fdf6..fb76e3cc 100644 --- a/app/templates/ui/app/create/create.html +++ b/app/templates/ui/app/create/create.html @@ -1,4 +1,4 @@ -
+

Create a Document

@@ -7,97 +7,97 @@

Create a Document

- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- - + +
-
+
{{tag}} - +
@@ -105,14 +105,14 @@

Create a Document

Cancel - +
diff --git a/app/templates/ui/app/detail/detail.component.js b/app/templates/ui/app/detail/detail.component.js new file mode 100644 index 00000000..c83cc426 --- /dev/null +++ b/app/templates/ui/app/detail/detail.component.js @@ -0,0 +1,13 @@ +(function() { + 'use strict'; + + angular.module('app.detail') + .component('detail', { + bindings: { + doc: '<' + }, + controller: 'DetailCtrl', + templateUrl: 'app/detail/detail.html' + }); + +}()); diff --git a/app/templates/ui/app/detail/detail.controller.js b/app/templates/ui/app/detail/detail.controller.js index 0be9d3bd..733438ee 100644 --- a/app/templates/ui/app/detail/detail.controller.js +++ b/app/templates/ui/app/detail/detail.controller.js @@ -1,14 +1,16 @@ /* global X2JS,vkbeautify */ -(function () { +(function() { 'use strict'; angular.module('app.detail') - .controller('DetailCtrl', DetailCtrl); + .controller('DetailCtrl', DetailCtrl); - DetailCtrl.$inject = ['doc', '$stateParams']; - function DetailCtrl(doc, $stateParams) { + DetailCtrl.$inject = ['$stateParams']; + + function DetailCtrl($stateParams) { var ctrl = this; var uri = $stateParams.uri; + var doc = this.doc; var contentType = doc.headers('content-type'); @@ -27,20 +29,26 @@ /* jscs: enable */ } else if (contentType.lastIndexOf('text/plain', 0) === 0) { ctrl.xml = doc.data; - ctrl.json = {'Document' : doc.data}; + ctrl.json = { + 'Document': doc.data + }; ctrl.type = 'text'; - } else if (contentType.lastIndexOf('application', 0) === 0 ) { + } else if (contentType.lastIndexOf('application', 0) === 0) { ctrl.xml = 'Binary object'; - ctrl.json = {'Document type' : 'Binary object'}; + ctrl.json = { + 'Document type': 'Binary object' + }; ctrl.type = 'binary'; } else { ctrl.xml = 'Error occured determining document type.'; - ctrl.json = {'Error' : 'Error occured determining document type.'}; + ctrl.json = { + 'Error': 'Error occured determining document type.' + }; } angular.extend(ctrl, { - doc : doc.data, - uri : uri + doc: doc.data, + uri: uri }); } }()); diff --git a/app/templates/ui/app/detail/detail.controller.spec.js b/app/templates/ui/app/detail/detail.controller.spec.js index e2997317..7d30b6cf 100644 --- a/app/templates/ui/app/detail/detail.controller.spec.js +++ b/app/templates/ui/app/detail/detail.controller.spec.js @@ -1,8 +1,8 @@ /* jshint -W117, -W030 */ -(function () { +(function() { 'use strict'; - describe('Controller: DetailCtrl', function () { + describe('Controller: DetailCtrl', function() { var controller; var doc; @@ -12,20 +12,24 @@ bard.inject('$controller', '$rootScope'); }); - beforeEach(function () { + beforeEach(function() { // stub the document - var headers = function() { return 'application/json'; }; + var headers = function() { + return 'application/json'; + }; doc = { headers: headers, data: { name: 'hi' } }; - controller = $controller('DetailCtrl', { doc: doc }); + controller = $controller('DetailCtrl', {}, { + doc: doc + }); $rootScope.$apply(); }); - it('should be created successfully', function () { + it('should be created successfully', function() { expect(controller).to.be.defined; }); diff --git a/app/templates/ui/app/detail/detail.html b/app/templates/ui/app/detail/detail.html index b5de742e..ea4766d7 100644 --- a/app/templates/ui/app/detail/detail.html +++ b/app/templates/ui/app/detail/detail.html @@ -2,24 +2,24 @@
- {{ctrl.type | uppercase}} + {{$ctrl.type | uppercase}}
- -
{{ctrl.xml}}
+ +
{{$ctrl.xml}}
- Download + Download
- + JSON
- +
- + XML
-
{{ctrl.xml}}
+
{{$ctrl.xml}}
@@ -29,7 +29,7 @@
Similar
- +
diff --git a/app/templates/ui/app/detail/similar-directive.html b/app/templates/ui/app/detail/similar-component.html similarity index 74% rename from app/templates/ui/app/detail/similar-directive.html rename to app/templates/ui/app/detail/similar-component.html index 901f0846..2f70fdbd 100644 --- a/app/templates/ui/app/detail/similar-directive.html +++ b/app/templates/ui/app/detail/similar-component.html @@ -1,8 +1,8 @@
-
\ No newline at end of file +
diff --git a/app/templates/ui/app/detail/similar-component.js b/app/templates/ui/app/detail/similar-component.js new file mode 100644 index 00000000..9c099a60 --- /dev/null +++ b/app/templates/ui/app/detail/similar-component.js @@ -0,0 +1,31 @@ +(function() { + + 'use strict'; + + angular.module('app.similar') + .component('mlSimilar', { + bindings: { + uri: '@', + limit: '@' + }, + controller: MlSimilar, + templateUrl: 'app/detail/similar-component.html' + }); + + MlSimilar.$inject = ['MLRest']; + + function MlSimilar(mlRest) { + var ctrl = this; + + mlRest.extension('extsimilar', { + method: 'GET', + params: { + 'rs:uri': ctrl.uri, + 'rs:limit': ctrl.limit ? ctrl.limit : 10 + } + }).then(function(response) { + ctrl.similar = response.data.similar; + }); + } + +}()); diff --git a/app/templates/ui/app/detail/similar-directive.js b/app/templates/ui/app/detail/similar-directive.js deleted file mode 100644 index 53a956ea..00000000 --- a/app/templates/ui/app/detail/similar-directive.js +++ /dev/null @@ -1,32 +0,0 @@ -(function () { - - 'use strict'; - - angular.module('app.similar') - .directive('mlSimilar', mlSimilar); - - mlSimilar.$inject = ['MLRest']; - - function mlSimilar(mlRest) { - return { - restrict: 'E', - templateUrl: 'app/detail/similar-directive.html', - scope: { uri: '@', limit: '@' }, - link: function(scope, iElement, iAttrs, ctrl) { - mlRest.extension('extsimilar', - { - method: 'GET', - params: - { - 'rs:uri': scope.uri, - 'rs:limit': scope.limit ? scope.limit : 10 - } - }) - .then(function(response) { - scope.similar = response.data.similar; - }); - } - }; - } - -}()); diff --git a/app/templates/ui/app/login/login-dir.html b/app/templates/ui/app/login/login-component.html similarity index 60% rename from app/templates/ui/app/login/login-dir.html rename to app/templates/ui/app/login/login-component.html index ba640235..a491de73 100644 --- a/app/templates/ui/app/login/login-dir.html +++ b/app/templates/ui/app/login/login-component.html @@ -1,13 +1,13 @@
-
-
Username and/or Password Incorrect
+ +
Username and/or Password Incorrect
- +
- +
- +
diff --git a/app/templates/ui/app/login/login-full.component.js b/app/templates/ui/app/login/login-full.component.js new file mode 100644 index 00000000..235da5ad --- /dev/null +++ b/app/templates/ui/app/login/login-full.component.js @@ -0,0 +1,11 @@ +(function() { + 'use strict'; + + angular.module('app.login') + .component('loginFull', { + bindings: {}, + controller: 'LoginFullCtrl', + templateUrl: 'app/login/login-full.html' + }); + +}()); diff --git a/app/templates/ui/app/login/login-full.html b/app/templates/ui/app/login/login-full.html index f7301298..38265c9e 100644 --- a/app/templates/ui/app/login/login-full.html +++ b/app/templates/ui/app/login/login-full.html @@ -1,7 +1,7 @@
diff --git a/app/templates/ui/app/login/login.component.js b/app/templates/ui/app/login/login.component.js new file mode 100644 index 00000000..c882c2d6 --- /dev/null +++ b/app/templates/ui/app/login/login.component.js @@ -0,0 +1,16 @@ +(function() { + + 'use strict'; + + angular.module('app.login') + .component('login', { + bindings: { + showCancel: '=', + mode: '@', + callback: '&' + }, + controller: 'LoginCtrl', + templateUrl: 'app/login/login-component.html', + }); + +}()); diff --git a/app/templates/ui/app/login/login.controller.js b/app/templates/ui/app/login/login.controller.js index b96c33ed..858d8e7f 100644 --- a/app/templates/ui/app/login/login.controller.js +++ b/app/templates/ui/app/login/login.controller.js @@ -1,4 +1,4 @@ -(function () { +(function() { 'use strict'; angular.module('app.login') @@ -6,6 +6,7 @@ .controller('LoginFullCtrl', LoginFullCtrl); LoginCtrl.$inject = ['$scope', 'loginService']; + function LoginCtrl($scope, loginService) { var ctrl = this; angular.extend(ctrl, { @@ -34,13 +35,16 @@ } function callback(user) { - if ($scope.callback && !loginService.loginError()) { - $scope.callback({user: user}); + if (ctrl.callback && !loginService.loginError()) { + ctrl.callback({ + user: user + }); } } } LoginFullCtrl.$inject = ['$state', '$stateParams']; + function LoginFullCtrl($state, $stateParams) { var ctrl = this; angular.extend(ctrl, { diff --git a/app/templates/ui/app/login/login.directive.js b/app/templates/ui/app/login/login.directive.js deleted file mode 100644 index 7087b564..00000000 --- a/app/templates/ui/app/login/login.directive.js +++ /dev/null @@ -1,23 +0,0 @@ -(function () { - - 'use strict'; - - angular.module('app.login') - .directive('login', LoginDirective); - - function LoginDirective() { - return { - restrict: 'EA', - controller: 'LoginCtrl', - controllerAs: 'ctrl', - replace: true, - scope: { - showCancel: '=', - mode: '@', - callback: '&' - }, - templateUrl: 'app/login/login-dir.html' - }; - } - -}()); diff --git a/app/templates/ui/app/login/login.module.js b/app/templates/ui/app/login/login.module.js index cba9264f..6a7e97b9 100644 --- a/app/templates/ui/app/login/login.module.js +++ b/app/templates/ui/app/login/login.module.js @@ -1,4 +1,6 @@ -(function () { +(function() { 'use strict'; - angular.module('app.login', ['app.messageBoard', 'ml.common', 'ui.bootstrap', 'ui.router']); + angular.module('app.login', ['app.messageBoard', 'ml.common', 'ui.bootstrap', + 'ui.router', 'app.user' + ]); }()); diff --git a/app/templates/ui/app/login/login.service.js b/app/templates/ui/app/login/login.service.js index ad932cdb..a2ae4299 100644 --- a/app/templates/ui/app/login/login.service.js +++ b/app/templates/ui/app/login/login.service.js @@ -1,13 +1,15 @@ -(function () { +(function() { 'use strict'; angular.module('app.login') .factory('loginService', LoginService); LoginService.$inject = ['$http', '$uibModal', '$q', '$rootScope', '$state', - '$stateParams', 'messageBoardService']; + '$stateParams', 'messageBoardService', '$transitions', 'userService' + ]; + function LoginService($http, $uibModal, $q, $rootScope, $state, - $stateParams, messageBoardService) { + $stateParams, messageBoardService, $transitions, userService) { var service = {}; var _loginMode = 'full'; // 'modal', 'top-right', or 'full' @@ -17,7 +19,6 @@ var _isAuthenticated; var _userPrefix = ''; var _protectedRoutes = []; - var deregisterLoginSuccess; function loginMode(mode) { if (mode === undefined) { @@ -47,9 +48,7 @@ } if (response.data.authenticated === false) { _isAuthenticated = false; - } - else - { + } else { loginSuccess(response); } return service.isAuthenticated(); @@ -59,7 +58,7 @@ function loginSuccess(response) { _loginError = null; _isAuthenticated = true; - $rootScope.$broadcast('loginService:login-success', response.data); + userService.updateUser(response); } function login(username, password) { @@ -72,6 +71,7 @@ }, failLogin); } + //loginPrompt not used for transition events atm due to weird state.go behaviour function loginPrompt() { var d = $q.defer(); if (_loginMode === 'modal') { @@ -95,27 +95,28 @@ keyboard: false }); } else if (_loginMode === 'top-right') { - messageBoardService.message({title: 'Please sign-in to see content.'}); + messageBoardService.message({ + title: 'Please sign-in to see content.' + }); var deregisterMsgBoard = $rootScope.$on('loginService:login-success', function(e, user) { messageBoardService.message(null); d.resolve(user); deregisterMsgBoard(); }); } else { - $state.go('root.login', - { - 'state': _toStateName || $state.current.name, - 'params': JSON.stringify((_toStateParams || $stateParams)) - }).then(function() { - d.reject(); - }); + $state.go('root.login', { + 'state': _toStateName || $state.current.name, + 'params': JSON.stringify((_toStateParams || $stateParams)) + }).then(function() { + d.reject(); + }); } return d.promise; } function logout() { return $http.get('/api/user/logout').then(function(response) { - $rootScope.$broadcast('loginService:logout-success', response); + userService.logOut(); _loginError = null; _isAuthenticated = false; $state.reload(); @@ -138,45 +139,34 @@ return _protectedRoutes.indexOf(route) > -1; } - function blockRoute(event, next, nextParams) { - event.preventDefault(); - service.loginPrompt(); - if (_loginMode !== 'full') { - if (deregisterLoginSuccess) { - deregisterLoginSuccess(); - deregisterLoginSuccess = null; - } - deregisterLoginSuccess = $rootScope.$on('loginService:login-success', function() { - deregisterLoginSuccess(); - deregisterLoginSuccess = null; - $state.go(next.name, nextParams); - }); - } - } + $transitions.onStart({ + to: '*.*' + }, function($transition$) { - $rootScope.$on('$stateChangeStart', function(event, next, nextParams) { - if (next.name !== 'root.login') { - _toStateName = next.name; - _toStateParams = nextParams; + if ($transition$.$to().name !== 'root.login') { + _toStateName = $transition$.$to().name; + _toStateParams = $transition$.$to().params; } - if (routeIsProtected(next.name)) { + if (routeIsProtected($transition$.$to().name)) { var auth = service.getAuthenticatedStatus(); - if (angular.isFunction(auth.then)) { - auth.then(function() { + return auth.then(function() { if (!service.isAuthenticated()) { - //this does NOT block requests in a timely fashion... - blockRoute(event, next, nextParams); + return $state.target('root.login', { + 'state': _toStateName || $state.current.name, + 'params': JSON.stringify((_toStateParams || $stateParams)) + }); } }); - } - else { + } else { if (!auth) { - blockRoute(event, next, nextParams); + return $state.target('root.login', { + 'state': _toStateName || $state.current.name, + 'params': JSON.stringify((_toStateParams || $stateParams)) + }); } } - } }); @@ -189,6 +179,7 @@ login: login, logout: logout, loginPrompt: loginPrompt, + loginSuccess: loginSuccess, loginError: loginError, loginMode: loginMode, isAuthenticated: isAuthenticated, diff --git a/app/templates/ui/app/login/login.service.spec.js b/app/templates/ui/app/login/login.service.spec.js index a6e7c547..0aa76ad5 100644 --- a/app/templates/ui/app/login/login.service.spec.js +++ b/app/templates/ui/app/login/login.service.spec.js @@ -1,8 +1,8 @@ /* jshint -W117, -W030 */ -(function () { +(function() { 'use strict'; - describe('Service: loginService', function () { + describe('Service: loginService', function() { var service; var modalOpened = false; @@ -23,9 +23,15 @@ }); bard.mockService($state, { - current: { name: 'root.search', params: {} }, + current: { + name: 'root.search', + params: {} + }, go: function(stateName, stateParams) { - this.current = { name: stateName, params: stateParams }; + this.current = { + name: stateName, + params: stateParams + }; return $q.when(); } }); @@ -33,19 +39,21 @@ bard.mockService($uibModal, { open: function() { modalOpened = true; - return { result: angular.noop }; + return { + result: angular.noop + }; } }); }); - beforeEach(inject(function (_loginService_) { + beforeEach(inject(function(_loginService_) { service = _loginService_; modalOpened = false; })); - it('should be defined', function () { + it('should be defined', function() { expect(service).to.be.defined; }); @@ -68,7 +76,7 @@ }); }); - describe('Service: loginService - should be authenticated if logged in already', function () { + describe('Service: loginService - should be authenticated if logged in already', function() { var service; var modalOpened = false; @@ -81,7 +89,8 @@ beforeEach(function() { bard.appModule('app.login'); - bard.inject('$q', '$http', '$uibModal', '$rootScope', '$state', '$stateParams'); + bard.inject('$q', '$http', '$uibModal', '$rootScope', '$state', '$stateParams', + '$transitions', 'userService'); bard.mockService($http, { _default: $q.when([]), @@ -89,9 +98,15 @@ }); bard.mockService($state, { - current: { name: 'root.search', params: {} }, + current: { + name: 'root.search', + params: {} + }, go: function(stateName, stateParams) { - this.current = { name: stateName, params: stateParams }; + this.current = { + name: stateName, + params: stateParams + }; return $q.when(); } }); @@ -99,13 +114,15 @@ bard.mockService($uibModal, { open: function() { modalOpened = true; - return { result: angular.noop }; + return { + result: angular.noop + }; } }); }); - beforeEach(inject(function (_loginService_) { + beforeEach(inject(function(_loginService_) { service = _loginService_; modalOpened = false; @@ -116,7 +133,7 @@ $rootScope.$apply(); })); - it('should be defined', function () { + it('should be defined', function() { expect(service).to.be.defined; }); diff --git a/app/templates/ui/app/message-board/message-board-component.html b/app/templates/ui/app/message-board/message-board-component.html new file mode 100644 index 00000000..484e518f --- /dev/null +++ b/app/templates/ui/app/message-board/message-board-component.html @@ -0,0 +1,4 @@ +
+

{{$ctrl.msg.title || $ctrl.msg}}

+

{{$ctrl.msg.body}}

+
diff --git a/app/templates/ui/app/message-board/message-board-dir.html b/app/templates/ui/app/message-board/message-board-dir.html deleted file mode 100644 index 13d1c899..00000000 --- a/app/templates/ui/app/message-board/message-board-dir.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

{{msg.title || msg}}

-

{{msg.body}}

-
diff --git a/app/templates/ui/app/message-board/message-board.directive.js b/app/templates/ui/app/message-board/message-board.component.js similarity index 57% rename from app/templates/ui/app/message-board/message-board.directive.js rename to app/templates/ui/app/message-board/message-board.component.js index 9407d98d..422ed524 100644 --- a/app/templates/ui/app/message-board/message-board.directive.js +++ b/app/templates/ui/app/message-board/message-board.component.js @@ -1,23 +1,15 @@ -(function () { +(function() { 'use strict'; angular.module('app.messageBoard') - .directive('messageBoard', MessageBoardDirective) - .controller('MessageBoardController', MessageBoardController); - - function MessageBoardDirective() { - return { - restrict: 'E', - controller: 'MessageBoardController', - controllerAs: 'ctrl', - replace: true, - scope: { + .component('messageBoard', { + bindings: { msg: '=' }, - templateUrl: 'app/message-board/message-board-dir.html' - }; - } + controller: MessageBoardController, + templateUrl: 'app/message-board/message-board-component.html', + }); MessageBoardController.$inject = ['$scope']; diff --git a/app/templates/ui/app/root/root.component.js b/app/templates/ui/app/root/root.component.js new file mode 100644 index 00000000..094df9a2 --- /dev/null +++ b/app/templates/ui/app/root/root.component.js @@ -0,0 +1,11 @@ +(function() { + 'use strict'; + + angular.module('app.root') + .component('root', { + bindings: {}, + controller: 'RootCtrl', + templateUrl: 'app/root/root.html' + }); + +}()); diff --git a/app/templates/ui/app/root/root.controller.js b/app/templates/ui/app/root/root.controller.js index d1770458..73e78301 100644 --- a/app/templates/ui/app/root/root.controller.js +++ b/app/templates/ui/app/root/root.controller.js @@ -1,16 +1,18 @@ -(function () { +(function() { 'use strict'; angular.module('app.root') .controller('RootCtrl', RootCtrl); - RootCtrl.$inject = ['messageBoardService', 'userService', '$scope']; + RootCtrl.$inject = ['messageBoardService', 'userService', 'loginService', '$scope']; - function RootCtrl(messageBoardService, userService, $scope) { + function RootCtrl(messageBoardService, userService, loginService, $scope) { var ctrl = this; ctrl.currentYear = new Date().getUTCFullYear(); ctrl.messageBoardService = messageBoardService; + loginService.getAuthenticatedStatus(); + $scope.$watch(userService.currentUser, function(newValue) { ctrl.currentUser = newValue; }); diff --git a/app/templates/ui/app/root/root.html b/app/templates/ui/app/root/root.html index be7b94f5..5d565410 100644 --- a/app/templates/ui/app/root/root.html +++ b/app/templates/ui/app/root/root.html @@ -15,7 +15,7 @@
@@ -23,8 +23,8 @@
- -
+ +
@@ -64,9 +64,9 @@
- \ No newline at end of file + diff --git a/app/templates/ui/app/route/routes.js b/app/templates/ui/app/route/routes.js index ba4346e4..6b1b0d09 100644 --- a/app/templates/ui/app/route/routes.js +++ b/app/templates/ui/app/route/routes.js @@ -1,10 +1,12 @@ -(function () { +(function() { 'use strict'; angular.module('app') - .run(['loginService', function(loginService) { - loginService.protectedRoutes(['root.search', 'root.create', 'root.profile']); - }]) + .run(['loginService', + function(loginService) { + loginService.protectedRoutes(['root.search', 'root.create', 'root.profile']); + } + ]) .config(Config); Config.$inject = ['$stateProvider', '$urlMatcherFactoryProvider', @@ -39,14 +41,7 @@ .state('root', { url: '', // abstract: true, - templateUrl: 'app/root/root.html', - controller: 'RootCtrl', - controllerAs: 'ctrl', - resolve: { - user: function(userService) { - return userService.getUser(); - } - } + component: 'root' }) .state('root.landing', { url: '/', @@ -59,9 +54,7 @@ }) .state('root.search', { url: '/search', - templateUrl: 'app/search/search.html', - controller: 'SearchCtrl', - controllerAs: 'ctrl', + component: 'search', navLabel: { text: 'Search', area: 'dashboard', @@ -70,9 +63,7 @@ }) .state('root.create', { url: '/create', - templateUrl: 'app/create/create.html', - controller: 'CreateCtrl', - controllerAs: 'ctrl', + component: 'create', navLabel: { text: 'Create', area: 'dashboard', @@ -92,13 +83,13 @@ value: null } }, - templateUrl: 'app/detail/detail.html', - controller: 'DetailCtrl', - controllerAs: 'ctrl', + component: 'detail', resolve: { doc: function(MLRest, $stateParams) { var uri = $stateParams.uri; - return MLRest.getDocument(uri, { format: 'json' }).then(function(response) { + return MLRest.getDocument(uri, { + format: 'json' + }).then(function(response) { return response; }); } @@ -106,15 +97,11 @@ }) .state('root.profile', { url: '/profile', - templateUrl: 'app/user/profile.html', - controller: 'ProfileCtrl', - controllerAs: 'ctrl' + component: 'profile' }) .state('root.login', { url: '/login?state¶ms', - templateUrl: 'app/login/login-full.html', - controller: 'LoginFullCtrl', - controllerAs: 'ctrl' + component: 'loginFull' }); } }()); diff --git a/app/templates/ui/app/search/search.component.js b/app/templates/ui/app/search/search.component.js new file mode 100644 index 00000000..b7a591c1 --- /dev/null +++ b/app/templates/ui/app/search/search.component.js @@ -0,0 +1,11 @@ +(function() { + 'use strict'; + + angular.module('app.search') + .component('search', { + bindings: {}, + controller: 'SearchCtrl', + templateUrl: 'app/search/search.html' + }); + +}()); diff --git a/app/templates/ui/app/search/search.html b/app/templates/ui/app/search/search.html index 0ddf1333..4952e1a4 100644 --- a/app/templates/ui/app/search/search.html +++ b/app/templates/ui/app/search/search.html @@ -1,23 +1,23 @@ -
Please log in to see content
-
+
Please log in to see content
+
- +
- -
+
-
+
Cancel - +
diff --git a/app/templates/ui/app/user/user-component.html b/app/templates/ui/app/user/user-component.html new file mode 100644 index 00000000..53fe3c4a --- /dev/null +++ b/app/templates/ui/app/user/user-component.html @@ -0,0 +1,16 @@ +
+ + + +
+ +
+
diff --git a/app/templates/ui/app/user/user-dir.html b/app/templates/ui/app/user/user-dir.html deleted file mode 100644 index ec449d3d..00000000 --- a/app/templates/ui/app/user/user-dir.html +++ /dev/null @@ -1,16 +0,0 @@ -
- - - -
- -
-
diff --git a/app/templates/ui/app/user/user.directive.js b/app/templates/ui/app/user/user.component.js similarity index 56% rename from app/templates/ui/app/user/user.directive.js rename to app/templates/ui/app/user/user.component.js index 28101c6e..8e8add6d 100644 --- a/app/templates/ui/app/user/user.directive.js +++ b/app/templates/ui/app/user/user.component.js @@ -1,25 +1,17 @@ -(function () { +(function() { 'use strict'; angular.module('app.user') - .directive('mlUser', UserDirective) - .controller('UserController', UserController); - - function UserDirective() { - return { - restrict: 'EA', - controller: 'UserController', - controllerAs: 'ctrl', - replace: true, - scope: { + .component('mlUser', { + bindings: { showCancel: '=', mode: '@', callback: '&' }, - templateUrl: 'app/user/user-dir.html' - }; - } + controller: UserController, + templateUrl: 'app/user/user-component.html' + }); UserController.$inject = ['$scope', 'userService', 'loginService']; @@ -31,7 +23,7 @@ loginService: loginService }); $scope.$watch(userService.currentUser, function(newValue) { - $scope.currentUser = newValue; + ctrl.currentUser = newValue; }); } diff --git a/app/templates/ui/app/user/user.module.js b/app/templates/ui/app/user/user.module.js index 1a3b87c1..0b7eb5f8 100644 --- a/app/templates/ui/app/user/user.module.js +++ b/app/templates/ui/app/user/user.module.js @@ -1,5 +1,4 @@ -(function () { +(function() { 'use strict'; - angular.module('app.user', ['ml.common', 'app.login', 'ngToast']); }()); diff --git a/app/templates/ui/app/user/user.service.js b/app/templates/ui/app/user/user.service.js index b66083a8..a872d831 100644 --- a/app/templates/ui/app/user/user.service.js +++ b/app/templates/ui/app/user/user.service.js @@ -1,25 +1,18 @@ -(function () { +(function() { 'use strict'; angular.module('app.user') .factory('userService', UserService); - UserService.$inject = ['$rootScope', 'loginService']; - function UserService($rootScope, loginService) { + UserService.$inject = ['$rootScope']; + + function UserService($rootScope) { var _currentUser = null; function currentUser() { return _currentUser; } - function getUser() { - if (_currentUser) { - return _currentUser; - } - - return loginService.getAuthenticatedStatus().then(currentUser); - } - function updateUser(response) { var data = response.data; @@ -36,17 +29,14 @@ return _currentUser; } - $rootScope.$on('loginService:login-success', function(e, user) { - updateUser({ data: user }); - }); - - $rootScope.$on('loginService:logout-success', function() { + function logOut() { _currentUser = null; - }); + } return { currentUser: currentUser, - getUser: getUser + updateUser: updateUser, + logOut: logOut }; } }()); diff --git a/app/templates/ui/app/user/user.service.spec.js b/app/templates/ui/app/user/user.service.spec.js index 93378d93..d7eff27d 100644 --- a/app/templates/ui/app/user/user.service.spec.js +++ b/app/templates/ui/app/user/user.service.spec.js @@ -14,7 +14,7 @@ beforeEach(function() { bard.appModule('app.user'); - bard.inject('$q', '$http', '$rootScope', '$state', 'loginService'); + bard.inject('$q', '$http', '$rootScope', '$state'); bard.mockService($http, { _default: $q.when([]), @@ -23,9 +23,15 @@ }); bard.mockService($state, { - current: { name: 'root.search', params: {} }, + current: { + name: 'root.search', + params: {} + }, go: function(stateName, stateParams) { - this.current = { name: stateName, params: stateParams }; + this.current = { + name: stateName, + params: stateParams + }; return $q.when(); }, reload: function() { @@ -33,10 +39,6 @@ } }); - bard.mockService(loginService, { - getAuthenticatedStatus: $q.when() - }); - }); beforeEach(inject(function(_userService_) { @@ -51,37 +53,25 @@ expect(service.currentUser()).to.not.be.defined; }); - it('should get the current logged in user - if loginService not init', function() { - service.getUser().then(function(user) { - expect(user).to.deep.eq(null); - }); - - expect(loginService.getAuthenticatedStatus).to.have.been.calledOnce; - - $rootScope.$apply(); + it('should update the current user when logged in', function() { + service.updateUser(_user); + expect(service.currentUser().username).to.eq('bob'); }); - it('should update the current user when logged in using loginService', function(done) { - $rootScope.$broadcast('loginService:login-success', {data:_user}); - $rootScope.$apply(service); - - done(); - expect(service.currentUser().name).to.eq('bob'); - }); - - it('should not set user with invalid credentials', function () { + it('should not set user with invalid credentials', function() { _user.data.authenticated = false; - $rootScope.$broadcast('loginService:login-success', {data:_user}); - $rootScope.$apply(service); + service.updateUser(_user); - expect(service.currentUser().name).to.eq(undefined); + expect(service.currentUser()).to.eq(null); }); - it('should clear user after logout', function () { - $rootScope.$broadcast('loginService:logout-success'); - $rootScope.$apply(service); + it('should clear user after logout', function() { + _user.data.authenticated = true; + service.updateUser(_user); - expect(service.currentUser()).to.not.be.defined; + service.logOut(); + + expect(service.currentUser()).to.eq(null); }); }); }());