From f3787e85a6bd03d1096e96df345181b250020d60 Mon Sep 17 00:00:00 2001 From: Qun Huang Date: Fri, 14 Oct 2016 09:56:32 +0800 Subject: [PATCH] new pages to manage admins, reviewers and copilots --- config.json | 4 + src/app/admintool/admintool.controller.js | 397 ++++++++++++++++++ src/app/admintool/admintool.html | 142 +++++++ src/app/admintool/admintool.service.js | 307 ++++++++++++++ src/app/admintool/constants.js | 13 + .../admintool/remove-user-role-dialog.html | 26 ++ src/app/admintool/user-role-dialog.html | 72 ++++ src/app/app.js | 5 + src/app/login/login.html | 4 +- src/assets/images/appirio-logo.png | Bin 1853 -> 0 bytes src/assets/images/logo.png | Bin 0 -> 4345 bytes src/components/common/navigation.html | 3 +- src/favicon.ico | Bin 5430 -> 1150 bytes src/index.html | 2 +- 14 files changed, 971 insertions(+), 4 deletions(-) create mode 100644 src/app/admintool/admintool.controller.js create mode 100644 src/app/admintool/admintool.html create mode 100644 src/app/admintool/admintool.service.js create mode 100644 src/app/admintool/constants.js create mode 100644 src/app/admintool/remove-user-role-dialog.html create mode 100644 src/app/admintool/user-role-dialog.html delete mode 100644 src/assets/images/appirio-logo.png create mode 100644 src/assets/images/logo.png diff --git a/config.json b/config.json index 1f9b42f..3c099af 100644 --- a/config.json +++ b/config.json @@ -3,6 +3,7 @@ "ES_PROJECT_API_URL": "http://127.0.0.1:8553", "API_URL" : "https://127.0.0.1:8443", "WORK_API_URL" : "https://127.0.0.1:8443", + "ADMIN_TOOL_URL" : "http://localhost:8080/api/v2", "API_VERSION_PATH" : "v3", "AUTH0_CLIENT_ID" : "JFDo7HMkf0q2CkVFHojy3zHWafziprhT", "AUTH0_DOMAIN" : "127.0.0.1:8443", @@ -13,6 +14,7 @@ "ES_PROJECT_API_URL": "https://internal-api.topcoder-dev.com", "API_URL" : "https://api.topcoder-dev.com", "WORK_API_URL" : "https://api-work.topcoder-dev.com", + "ADMIN_TOOL_URL" : "https://api.topcoder-dev.com/v2", "API_VERSION_PATH" : "v3", "AUTH0_CLIENT_ID" : "JFDo7HMkf0q2CkVFHojy3zHWafziprhT", "AUTH0_DOMAIN" : "topcoder-dev.auth0.com", @@ -23,6 +25,7 @@ "ES_PROJECT_API_URL": "https://internal-api.topcoder-qa.com", "API_URL" : "https://api.topcoder-qa.com", "WORK_API_URL" : "https://api-work.topcoder-qa.com", + "ADMIN_TOOL_URL" : "https://api.topcoder-qa.com/v2", "API_VERSION_PATH" : "v3", "AUTH0_CLIENT_ID" : "EVOgWZlCtIFlbehkq02treuRRoJk12UR", "AUTH0_DOMAIN" : "topcoder-qa.auth0.com", @@ -33,6 +36,7 @@ "API_URL" : "https://api.topcoder.com", "WORK_API_URL" : "https://api-work.topcoder.com", "ES_PROJECT_API_URL": "https://internal-api.topcoder.com", + "ADMIN_TOOL_URL" : "https://api.topcoder.com/v2", "API_VERSION_PATH" : "v3", "AUTH0_CLIENT_ID" : "6ZwZEUo2ZK4c50aLPpgupeg5v2Ffxp9P", "AUTH0_DOMAIN" : "topcoder.auth0.com", diff --git a/src/app/admintool/admintool.controller.js b/src/app/admintool/admintool.controller.js new file mode 100644 index 0000000..b2126db --- /dev/null +++ b/src/app/admintool/admintool.controller.js @@ -0,0 +1,397 @@ +'use strict'; + +var module = angular.module('supportAdminApp'); + +module.controller('admintool.AdminToolController', [ + '$scope', '$timeout', '$uibModal', 'AuthService', 'AdminToolService', 'Alert', 'admintool.Constants', + function ($scope, $timeout, $modal, $authService, $adminToolService, $alert, $const) { + $scope.users = []; + $scope.reviewBoardProjectCategories = []; + $scope.v2Token = null; + $scope.constRoles = $const.Roles; + // search + $scope.formSearch = { + handle: '', + role: '', + categoryId: '', + isLoading: false, + usersFound: false, + reviewBoardProjectCategoriesFound: false, + isAdmin: function () { + return this.role === $const.Roles.Admin; + }, + isCopilot: function () { + return this.role === $const.Roles.Copilot; + }, + isReviewer: function () { + return this.role === $const.Roles.Reviewer; + }, + setLoading: function (loading) { + this.isLoading = loading; + } + }; + + + $scope.$on('adminTools.TableDataUpdated', function () { + $timeout(function () { + $('.footable').trigger('footable_redraw'); + }, 100); + }); + + + // auth + $scope.authorized = function () { + return $authService.isLoggedIn(); + }; + + $scope.changeRole = function () { + $scope.users = []; + $scope.formSearch.usersFound = false; + $alert.clear(); + }; + + // search users with role input and will use client side filter for handle + $scope.search = function (notClear) { + if (!notClear) { + $alert.clear(); + } + + var handle = $scope.formSearch.handle, role = $scope.formSearch.role; + + $scope.formSearch.setLoading(true); + var searchMethod = $scope.formSearch.isReviewer() ? + $adminToolService.findReviewers($scope.v2Token, $scope.formSearch.categoryId) + : $adminToolService['find' + role + 's']($scope.v2Token); + searchMethod.then( + function (users) { + if (handle) { + users = users.filter(function (user) { + // filter handle with case insensitive + return angular.lowercase(user.name) === angular.lowercase(handle); + }); + } + $scope.users = users; + $scope.formSearch.setLoading(false); + $scope.formSearch.usersFound = true; + $scope.$broadcast('adminTools.TableDataUpdated'); + }, + function (error) { + $alert.error(error.error, $scope); + $scope.formSearch.setLoading(false); + } + ); + }; + + // exchange v3 token with v2 token + $scope.formSearch.setLoading(true); + $adminToolService.getV2Token().then(function (token) { + $scope.v2Token = token; + $adminToolService.findReviewBoardProjectCategories($scope.v2Token).then(function (projectCategories) { + projectCategories = projectCategories.filter(function (projectCategory) { + return $const.ExcludeCategories.indexOf(angular.lowercase(projectCategory.name)) === -1; + }); + projectCategories = projectCategories.sort(function (p1, p2) { + return p1.name.localeCompare(p2.name); + }); + $scope.reviewBoardProjectCategories = projectCategories; + $scope.formSearch.setLoading(false); + }, + function (error) { + $alert.error(error.error, $scope); + $scope.formSearch.setLoading(false); + }) + }, + function (error) { + $alert.error(error.error, $scope); + $scope.formSearch.setLoading(false); + }); + + // open remove user role dialog + $scope.openRemoveUserRoleDialog = function (index) { + $modal.open({ + size: 'sm', + templateUrl: 'app/admintool/remove-user-role-dialog.html', + controller: 'admintool.RemoveUserRoleDialogController', + resolve: { + v2Token: function () { + return $scope.v2Token; + }, + user: function () { + return $scope.users[index]; + }, + role: function () { + return $scope.formSearch.role; + } + } + }).result.then(function (result) { + $alert.info(result.message); + $scope.search(true); + }); + }; + + // open new user role dialog + $scope.openNewUserRoleDialog = function () { + $modal.open({ + size: 'sm', + templateUrl: 'app/admintool/user-role-dialog.html', + controller: 'admintool.NewUserRoleDialogController', + resolve: { + v2Token: function () { + return $scope.v2Token; + }, + role: function () { + return $scope.formSearch.role; + }, + categoryId: function () { + return $scope.formSearch.categoryId; + }, + reviewBoardProjectCategories: function () { + return $scope.reviewBoardProjectCategories; + } + } + }).result.then(function (result) { + $scope.formSearch.role = result.role; + if ($scope.formSearch.isReviewer()) { + $scope.formSearch.categoryId = result.categoryId; + } + $alert.info(result.message); + $scope.search(true); + }); + }; + + // open edit user role dialog + $scope.openEditUserRoleDialog = function (index) { + $modal.open({ + size: 'sm', + templateUrl: 'app/admintool/user-role-dialog.html', + controller: 'admintool.EditUserRoleDialogController', + resolve: { + v2Token: function () { + return $scope.v2Token; + }, + user: function () { + return $scope.users[index]; + }, + role: function () { + return $scope.formSearch.role; + }, + categoryId: function () { + return $scope.formSearch.categoryId; + }, + reviewBoardProjectCategories: function () { + return $scope.reviewBoardProjectCategories; + } + } + }).result.then(function (result) { + if ($scope.formSearch.isReviewer()) { + $scope.formSearch.categoryId = result.categoryId; + } + $alert.info($scope.formSearch.role + ' ' + result.name + ' has been successfully updated!'); + $scope.search(true); + }); + }; + + } +]); +module.controller('admintool.RemoveUserRoleDialogController', [ + '$scope', '$uibModalInstance', 'AdminToolService', 'Alert', 'v2Token', 'user', 'role', 'admintool.Constants', + function ($scope, $modalInstance, $adminToolService, $alert, v2Token, user, role, $const) { + $scope.form = { + user: user, + role: role, + isLoading: false, + setLoading: function (loading) { + this.isLoading = loading; + }, + }; + + $scope.cancel = function () { + $modalInstance.dismiss(); + }; + + $scope.remove = function () { + $alert.clear(); + $scope.form.setLoading(true); + var data = { + username: user.name + }; + if (role === $const.Roles.Reviewer) { + data.categoryId = user.projectCategoryId; + } + $adminToolService['delete' + role](v2Token, data).then( + function (result) { + $scope.form.setLoading(false); + $modalInstance.close(result); + }, + function (error) { + $alert.error(error.error, $scope); + $scope.form.setLoading(false); + } + ); + }; + } +]); + +module.controller('admintool.NewUserRoleDialogController', [ + '$scope', '$uibModalInstance', 'AdminToolService', 'Alert', 'v2Token', 'role', 'categoryId', 'reviewBoardProjectCategories', + 'admintool.Constants', + function ($scope, $modalInstance, $adminToolService, $alert, v2Token, role, categoryId, reviewBoardProjectCategories, $const) { + $scope.reviewBoardProjectCategories = reviewBoardProjectCategories; + $scope.constRoles = $const.Roles; + $scope.form = { + role: role, + user: { + username: '' + }, + isCopilot: function () { + return this.role === $const.Roles.Copilot; + }, + isReviewer: function () { + return this.role === $const.Roles.Reviewer; + }, + isLoading: false, + setLoading: function (loading) { + this.isLoading = loading; + } + }; + if ($scope.form.isCopilot()) { + $scope.form.user.isSoftwareCopilot = false; + $scope.form.user.isStudioCopilot = false; + } else if ($scope.form.isReviewer()) { + $scope.form.user.categoryId = categoryId; + $scope.form.editImmune = false; + } + + $scope.cancel = function () { + $modalInstance.dismiss(); + }; + + $scope.ok = function (form) { + if (!form.$valid) { + return; + } + $alert.clear(); + $scope.form.setLoading(true); + var newUser = angular.copy($scope.form.user); + if ($scope.form.isCopilot()) { + newUser.isSoftwareCopilot = !!newUser.isSoftwareCopilot; + newUser.isStudioCopilot = !!newUser.isStudioCopilot; + } else if ($scope.form.isReviewer()) { + if ($scope.form.editImmune) { + newUser.immune = !!newUser.immune; + } else { + delete newUser.immune; + } + } + + $adminToolService['create' + $scope.form.role](v2Token, newUser).then( + function (result) { + $scope.form.setLoading(false); + result.role = $scope.form.role; + if ($scope.form.isReviewer()) { + result.categoryId = newUser.categoryId; + } + $modalInstance.close(result); + }, + function (error) { + $alert.error(error.error, $scope); + $scope.form.setLoading(false); + } + ); + }; + } +]); + +module.controller('admintool.EditUserRoleDialogController', [ + '$scope', '$uibModalInstance', 'AdminToolService', 'Alert', 'v2Token', 'user', 'role', 'categoryId', 'reviewBoardProjectCategories', 'admintool.Constants', + function ($scope, $modalInstance, $adminToolService, $alert, v2Token, user, role, categoryId, reviewBoardProjectCategories, $const) { + $scope.reviewBoardProjectCategories = reviewBoardProjectCategories; + $scope.constRoles = $const.Roles; + $scope.form = { + role: role, + user: { + id: user.id, + username: user.name + }, + isCopilot: function () { + return this.role === $const.Roles.Copilot; + }, + isReviewer: function () { + return this.role === $const.Roles.Reviewer; + }, + isLoading: false, + setLoading: function (loading) { + this.isLoading = loading; + } + }; + + if ($scope.form.isCopilot()) { + $scope.form.user.isSoftwareCopilot = user.softwareCopilot; + $scope.form.user.isStudioCopilot = user.studioCopilot; + } else if ($scope.form.isReviewer()) { + $scope.form.user.categoryId = categoryId; + $scope.form.user.immune = user.immune; + $scope.form.editImmune = true; + } + + $scope.cancel = function () { + $modalInstance.dismiss(); + }; + + $scope.ok = function (form) { + if (!form.$valid) { + return; + } + $alert.clear(); + $scope.form.setLoading(true); + var updatedUser = angular.copy($scope.form.user); + var updateMethod = null; + if ($scope.form.isCopilot()) { + if (updatedUser.isSoftwareCopilot === user.softwareCopilot + && updatedUser.isStudioCopilot === user.studioCopilot) { + // no updates + $modalInstance.close(user); + return; + } + updateMethod = $adminToolService.updateCopilot(v2Token, updatedUser); + } + if ($scope.form.isReviewer()) { + if ($scope.form.editImmune) { + updatedUser.immune = !!updatedUser.immune; + } else { + // reset to old value + updatedUser.immune = user.immune; + } + if (updatedUser.categoryId === categoryId + && updatedUser.immune === user.immune) { + user.categoryId = categoryId; + // no updates + $modalInstance.close(user); + return; + } + updateMethod = $adminToolService.updateReviewer(v2Token, { + username: user.name, + categoryId: categoryId + }, updatedUser); + } + updateMethod.then( + function () { + $scope.form.setLoading(false); + if ($scope.form.isCopilot()) { + user.softwareCopilot = updatedUser.isSoftwareCopilot; + user.studioCopilot = updatedUser.isStudioCopilot; + } else if ($scope.form.isReviewer()) { + user.immune = updatedUser.immune; + user.categoryId = updatedUser.categoryId; + } + $modalInstance.close(user); + }, + function (error) { + $scope.form.setLoading(false); + $alert.error(error.error, $scope); + } + ); + }; + } +]); + diff --git a/src/app/admintool/admintool.html b/src/app/admintool/admintool.html new file mode 100644 index 0000000..f2107ac --- /dev/null +++ b/src/app/admintool/admintool.html @@ -0,0 +1,142 @@ +
+
+

Admins / Copilots / Reviewers

+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+

+ Tips:
+

+

- Please choose role to find users first.

+

- Please choose challenge category.

+
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+

No users found.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
User IDHandleIs In Admin Group?Has Admin Role?Is Manager (Online Review)?Is Software Copilot?Is Studio Copilot?Is Immune?Action
{{user.id}}{{user.name}}{{user.adminGroup}}{{user.adminRole}}{{user.managerResource}}{{user.softwareCopilot}}{{user.studioCopilot}}{{user.immune}} + + Edit + + + Remove + +
+
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/app/admintool/admintool.service.js b/src/app/admintool/admintool.service.js new file mode 100644 index 0000000..2cc400b --- /dev/null +++ b/src/app/admintool/admintool.service.js @@ -0,0 +1,307 @@ +'use strict'; + +angular.module('supportAdminApp') + .factory('AdminToolService', ['$log', '$q', '$http', 'ADMIN_TOOL_URL', 'API_URL', 'API_VERSION_PATH', + function ($log, $q, $http, ADMIN_TOOL_URL, API_URL, API_VERSION_PATH) { + var service = { + getV2Token: getV2Token, + findAdmins: findAdmins, + createAdmin: createAdmin, + deleteAdmin: deleteAdmin, + findCopilots: findCopilots, + createCopilot: createCopilot, + deleteCopilot: deleteCopilot, + updateCopilot: updateCopilot, + findReviewers: findReviewers, + createReviewer: createReviewer, + deleteReviewer: deleteReviewer, + updateReviewer: updateReviewer, + findReviewBoardProjectCategories: findReviewBoardProjectCategories + }; + + /** + * Get v2 token with v3 token + */ + function getV2Token() { + return $http({ + method: 'GET', + url: API_URL + '/' + API_VERSION_PATH + '/authorizations/1' + }).then( + function (response) { + $log.debug(response); + if (response.data && response.data.result && response.data.result.content + && response.data.result.content.externalToken) { + return response.data.result.content.externalToken; + } else { + return $q.reject({ + error: 'Cannot find v2 token in response.' + }); + } + }, + function (error) { + $log.error(error); + var err; + if (error && error.data && error.data.result) { + err = { + status: error.status, + error: error.data.result.content + }; + } + if (!err) { + err = { + status: error.status, + error: error.statusText + }; + } + return $q.reject(err); + } + ); + } + + /** + * helper function to process http request + */ + var _processRequest = function (request, key) { + return request.then( + function (response) { + var data = response.data && key && response.data[key] ? response.data[key] : response.data; + // only two requests to get review board categories actually + if (Array.isArray(response) && response.length === 2 && Array.isArray(response[0].data) && Array.isArray(response[1].data)) { + data = response[0].data.concat(response[1].data); + } + if (data && data.success === false) { + return $q.reject({ + error: data.message || 'Unknown server error' + }); + } else if (data && data.error) { + return $q.reject({ + error: data.error + }); + } else { + return data; + } + }, + function (error) { + $log.error(error); + var err; + if (error && error.data && error.data.error) { + err = { + status: error.status, + error: error.data.error.details || error.data.error.description || error.data.error.name + }; + } + if (!err) { + err = { + status: error.status, + error: error.statusText || 'Please make sure tc api server is running' + }; + } + return $q.reject(err); + } + ); + }; + + + /** + * Find admins + */ + function findAdmins(token) { + var request = $http({ + method: 'GET', + url: ADMIN_TOOL_URL + '/admin/admins', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + } + }); + return _processRequest(request, 'allAdmins'); + } + + /** + * creates admin user + */ + function createAdmin(token, data) { + var request = $http({ + method: 'POST', + url: ADMIN_TOOL_URL + '/admin/admins', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + /** + * Delete an existing admin user + */ + function deleteAdmin(token, data) { + var request = $http({ + method: "DELETE", + url: ADMIN_TOOL_URL + "/admin/admins", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + + /** + * Find copilots + */ + function findCopilots(token) { + var request = $http({ + method: 'GET', + url: ADMIN_TOOL_URL + '/admin/copilots', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + } + }); + return _processRequest(request, 'allCopilots'); + } + + /** + * creates copilot + */ + function createCopilot(token, data) { + var request = $http({ + method: 'POST', + url: ADMIN_TOOL_URL + '/admin/copilots', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + /** + * Delete copilot + */ + function deleteCopilot(token, data) { + var request = $http({ + method: "DELETE", + url: ADMIN_TOOL_URL + "/admin/copilots", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + /** + * Update copilot + */ + function updateCopilot(token, data) { + return deleteCopilot(token, data).then(function () { + return createCopilot(token, data); + }); + } + + + /** + * Find Reviewers + */ + function findReviewers(token, categoryId) { + var request = $http({ + method: 'GET', + url: ADMIN_TOOL_URL + '/admin/reviewers', + params: { + categoryId: categoryId + }, + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + } + }); + return _processRequest(request, 'reviewers'); + } + + + /** + * creates Reviewer + */ + function createReviewer(token, data) { + var request = $http({ + method: 'POST', + url: ADMIN_TOOL_URL + '/admin/reviewers', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + /** + * Delete Reviewer + */ + function deleteReviewer(token, data) { + var request = $http({ + method: "DELETE", + url: ADMIN_TOOL_URL + "/admin/reviewers", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + }, + data: angular.toJson(data) + }); + return _processRequest(request); + } + + + /** + * Update Reviewer + */ + function updateReviewer(token, oldReviewer, newReviewer) { + var requests = [deleteReviewer(token, oldReviewer)]; + if (oldReviewer.categoryId !== newReviewer.categoryId) { + requests.push(deleteReviewer(token, { + username: newReviewer.username, + categoryId: newReviewer.categoryId + }).catch(function (error) { + // new reviewer role may not exist + if (error.status !== 404) { + return $q.reject(error); + } + })); + } + return $q.all(requests).then(function () { + delete newReviewer.id; + return createReviewer(token, newReviewer) + }); + } + + /** + * Find review board project categories + */ + function findReviewBoardProjectCategories(token) { + var request = $q.all([$http({ + method: 'GET', + url: ADMIN_TOOL_URL + '/develop/challengetypes', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + } + }), $http({ + method: 'GET', + url: ADMIN_TOOL_URL + '/design/challengetypes', + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + token + } + })]); + return _processRequest(request); + } + + return service; + }]); diff --git a/src/app/admintool/constants.js b/src/app/admintool/constants.js new file mode 100644 index 0000000..392c79d --- /dev/null +++ b/src/app/admintool/constants.js @@ -0,0 +1,13 @@ +'use strict'; + +var module = angular.module('supportAdminApp'); + +module.constant('admintool.Constants', { + // excluding challenge categories for reviewer role must use lower case + ExcludeCategories: [angular.lowercase('Copilot Posting'), angular.lowercase('Other'), angular.lowercase('Studio Other')], + Roles: { + Admin: 'Admin', + Copilot: 'Copilot', + Reviewer: 'Reviewer', + } +}); diff --git a/src/app/admintool/remove-user-role-dialog.html b/src/app/admintool/remove-user-role-dialog.html new file mode 100644 index 0000000..0d05369 --- /dev/null +++ b/src/app/admintool/remove-user-role-dialog.html @@ -0,0 +1,26 @@ +
    + + + +
    + +
    +
    diff --git a/src/app/admintool/user-role-dialog.html b/src/app/admintool/user-role-dialog.html new file mode 100644 index 0000000..d91d3df --- /dev/null +++ b/src/app/admintool/user-role-dialog.html @@ -0,0 +1,72 @@ +
    + + + +
    + +
    +
    diff --git a/src/app/app.js b/src/app/app.js index 1eeebef..b591c20 100755 --- a/src/app/app.js +++ b/src/app/app.js @@ -61,6 +61,11 @@ angular.module('supportAdminApp', [ templateUrl: 'app/users/users.html', data: { pageTitle: 'User Management' } }) + .state('index.admintool', { + url: '/admintool', + templateUrl: 'app/admintool/admintool.html', + data: { pageTitle: 'Admins / Copilots / Reviewers Management' } + }) .state('index.sso', { url: '/sso', templateUrl: 'app/sso/sso.html', diff --git a/src/app/login/login.html b/src/app/login/login.html index 704a04f..0af6d1c 100755 --- a/src/app/login/login.html +++ b/src/app/login/login.html @@ -2,7 +2,7 @@
    - \ No newline at end of file + diff --git a/src/assets/images/appirio-logo.png b/src/assets/images/appirio-logo.png deleted file mode 100644 index b55ac756ed55975d1ca9f4dee7406d5232619caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 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 literal 0 HcmV?d00001 diff --git a/src/components/common/navigation.html b/src/components/common/navigation.html index 3d9c94c..55c8b1f 100755 --- a/src/components/common/navigation.html +++ b/src/components/common/navigation.html @@ -2,7 +2,7 @@