diff --git a/app/config/apiMapping.js b/app/config/apiMapping.js index b35e4862..69121135 100644 --- a/app/config/apiMapping.js +++ b/app/config/apiMapping.js @@ -251,6 +251,11 @@ var apiMapping = { submitRequest: { 'endpoint': '/private/queue', 'controller': 'services' + }, + page: { + 'endpoint': '/private/queue', + 'controller': 'services', + 'method': 'page' } }, Notification: { diff --git a/app/config/routes.js b/app/config/routes.js index a60498d7..34156047 100644 --- a/app/config/routes.js +++ b/app/config/routes.js @@ -1,20 +1,20 @@ app.config(function ($routeProvider) { $routeProvider. when('/management', { - redirectTo: '/management/services', - access: ["ROLE_ADMIN", "ROLE_WEB_MANAGER", "ROLE_SERVICE_MANAGER"] + redirectTo: function () { + if (sessionStorage.role === 'ROLE_WEB_MANAGER') { + return '/management/notes'; + } else if (sessionStorage.role === 'ROLE_NOTICE_MANAGER') { + return '/management/notifications'; + } else { + return '/management/services'; + } + }, + access: ["ROLE_ADMIN", "ROLE_SERVICE_ADMIN", "ROLE_SERVICE_MANAGER", "ROLE_WEB_MANAGER", "ROLE_NOTICE_MANAGER"] }). when('/management/:tab', { templateUrl: 'views/management.html', - access: ["ROLE_ADMIN", "ROLE_WEB_MANAGER", "ROLE_SERVICE_MANAGER"] - }). - when('/services', { - templateUrl: 'views/management/services.html', - access: ["ROLE_ADMIN", "ROLE_WEB_MANAGER", "ROLE_SERVICE_MANAGER"] - }). - when('/notes', { - templateUrl: 'views/management/notes.html', - access: ["ROLE_ADMIN", "ROLE_WEB_MANAGER", "ROLE_SERVICE_MANAGER"] + access: ["ROLE_ADMIN", "ROLE_SERVICE_ADMIN", "ROLE_SERVICE_MANAGER", "ROLE_WEB_MANAGER", "ROLE_NOTICE_MANAGER"] }). when('/service/:serviceId/detail', { templateUrl: 'views/detail/service.html', diff --git a/app/controllers/abstractIdeaController.js b/app/controllers/abstractIdeaController.js index 132e730e..0c53c7ce 100644 --- a/app/controllers/abstractIdeaController.js +++ b/app/controllers/abstractIdeaController.js @@ -46,8 +46,10 @@ app.controller('AbstractIdeaController', function ($controller, $scope, FeatureP $scope.clearOverallCheckbox = function () { var overallCheckbox = angular.element('#overallCheckbox')[0]; - overallCheckbox.indeterminate = false; - overallCheckbox.checked = false; + if(overallCheckbox) { + overallCheckbox.indeterminate = false; + overallCheckbox.checked = false; + } }; $scope.createFeatureProposal = function () { diff --git a/app/controllers/appAbstractController.js b/app/controllers/appAbstractController.js index d2cf0601..fd52120f 100644 --- a/app/controllers/appAbstractController.js +++ b/app/controllers/appAbstractController.js @@ -4,8 +4,17 @@ app.controller("AppAbstractController", function ($controller, $scope) { $scope: $scope })); - $scope.isManager = function () { - return $scope.isServiceManager() || $scope.isWebManager(); + $scope.hasAdminAccess = function () { + return ($scope.isAdmin() || $scope.isServiceAdmin()); + }; + + // Admins have management access + $scope.hasManagementAccess= function () { + return ($scope.hasAdminAccess() || $scope.isWebManager() || $scope.isServiceManager() || $scope.isNoticeManager()); + }; + + $scope.isServiceAdmin = function () { + return (sessionStorage.role === "ROLE_SERVICE_ADMIN"); }; $scope.isWebManager = function () { @@ -16,15 +25,17 @@ app.controller("AppAbstractController", function ($controller, $scope) { return (sessionStorage.role === "ROLE_SERVICE_MANAGER"); }; + $scope.isNoticeManager = function () { + return (sessionStorage.role === "ROLE_NOTICE_MANAGER"); + }; + $scope.isStaff = function () { return (sessionStorage.role === "ROLE_STAFF"); }; $scope.isFullServiceConsumer = function () { return $scope.isStaff() || - $scope.isServiceManager() || - $scope.isWebManager() || - $scope.isAdmin(); + $scope.hasManagementAccess(); }; }); \ No newline at end of file diff --git a/app/controllers/dashboardController.js b/app/controllers/dashboardController.js index 2082be83..eca9ccbf 100644 --- a/app/controllers/dashboardController.js +++ b/app/controllers/dashboardController.js @@ -13,7 +13,9 @@ app.controller("DashboardController", function ($controller, $scope, UserService $scope.showPublic = function () { var user = UserService.getCurrentUser(); var publicView = false; - if (user.role === 'ROLE_ANONYMOUS' || user.role === 'ROLE_USER') { + if (user.role === undefined || user.role === null) { + publicView = true; + } else if (user.role === 'ROLE_ANONYMOUS' || user.role === 'ROLE_USER') { publicView = true; } return publicView; @@ -38,4 +40,4 @@ app.controller("DashboardController", function ($controller, $scope, UserService NoteRepo.page(); -}); \ No newline at end of file +}); diff --git a/app/controllers/featureProposalController.js b/app/controllers/featureProposalController.js index 4509b1bb..4554fdf0 100644 --- a/app/controllers/featureProposalController.js +++ b/app/controllers/featureProposalController.js @@ -1,51 +1,75 @@ -app.controller('FeatureProposalController', function ($controller, $scope, Idea, FeatureProposal, FeatureProposalRepo, ProjectService) { +app.controller('FeatureProposalController', function($controller, $scope, Idea, FeatureProposal, ProjectService) { angular.extend(this, $controller('AbstractIdeaController', { $scope: $scope })); - $scope.repo = FeatureProposalRepo; - $scope.fpToDelete = {}; $scope.ideaToAdd = {}; - $scope.filters = [ - { - gloss: 'Service', - property: 'service.name' - }, - { - gloss: 'Title', - property: 'title' - }, - { - gloss: 'Description', - property: 'description' - }, - { - gloss: 'Submitted', - property: 'submitted' - }, - { - gloss: 'Last Modified', - property: 'lastModified' - } - ]; + $scope.weaverTable = { + repo: $scope.fpRepo, + columns: [{ + gloss: 'Service', + property: 'service.name', + filterable: true, + sortable: true + }, + { + gloss: 'Title', + property: 'title', + filterable: true, + sortable: true + }, + { + gloss: 'Description', + property: 'description', + filterable: true, + sortable: false + }, + { + gloss: 'Last Modified', + property: 'lastModified', + filterable: true, + sortable: true + }, + { + gloss: 'Submitted', + property: 'submitted', + filterable: true, + sortable: true + }, + { + gloss: 'Actions', + filterable: false, + sortable: false + } + ], + activeSort: [{ + property: 'service.name', + direction: 'ASC' + }, + { + property: 'lastModified', + direction: 'DESC' + } + ] + }; $scope.removedIdeas = []; - $scope.tableParams = FeatureProposalRepo.getTableParams(); + $scope.tableParams = $scope.fpRepo.getTableParams(); - $scope.editFeatureProposal = function (fp) { + $scope.editFeatureProposal = function(fp) { $scope.fpData = fp; $scope.openModal('#editFpModal'); }; - $scope.removeIdea = function (idea) { - if ($scope.fpData.ideas.some(function (i) { - return i.id === idea.id; - })) { + $scope.removeIdea = function(idea) { + if ($scope.fpData.ideas.some(function(i) { + return i.id === idea.id; + })) { $scope.removedIdeas.push(new Idea(idea)); $scope.forms.updateFp.$setDirty(); $scope.fpData.dirty(true); @@ -53,11 +77,11 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, } }; - $scope.updateFeatureProposal = function (fp) { - FeatureProposalRepo.update($scope.fpData).then(function (res) { + $scope.updateFeatureProposal = function(fp) { + $scope.fpRepo.update($scope.fpData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.resetFeatureProposals(); - for(var i in $scope.removedIdeas) { + for (var i in $scope.removedIdeas) { var idea = $scope.removedIdeas[i]; idea.elevated = false; idea.save(); @@ -67,27 +91,27 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, }); }; - $scope.select = function (fp, modal) { + $scope.select = function(fp, modal) { $scope.fpData = fp; $scope.openModal(modal); }; - $scope.submitFeatureProposal = function (fp) { + $scope.submitFeatureProposal = function(fp) { $scope.submitting = true; - ProjectService.submitFeatureProposal(fp).then(function () { + ProjectService.submitFeatureProposal(fp).then(function() { $scope.submitting = false; $scope.resetFeatureProposals(); }); }; - $scope.confirmDeleteFp = function (fp) { + $scope.confirmDeleteFp = function(fp) { $scope.openModal('#deleteFpModal'); $scope.fpToDelete = fp; }; - $scope.deleteFp = function () { + $scope.deleteFp = function() { $scope.deleting = true; - $scope.fpToDelete.delete().then(function () { + $scope.fpToDelete.delete().then(function() { $scope.closeModal(); $scope.deleting = false; $scope.fpToDelete = {}; diff --git a/app/controllers/ideaController.js b/app/controllers/ideaController.js index ea139ed9..9456b3b3 100644 --- a/app/controllers/ideaController.js +++ b/app/controllers/ideaController.js @@ -1,36 +1,60 @@ -app.controller('IdeaController', function ($controller, $scope, $timeout, FeatureProposalRepo, Idea, IdeaRepo, ServiceRepo) { +app.controller('IdeaController', function($controller, $scope, $timeout, FeatureProposalRepo, Idea, ServiceRepo) { angular.extend(this, $controller('AbstractIdeaController', { $scope: $scope })); - $scope.repo = IdeaRepo; - $scope.ideaToDelete = {}; - $scope.filters = [{ - gloss: 'Service', - property: 'service.name' - }, - { - gloss: 'Title', - property: 'title' - }, - { - gloss: 'Description', - property: 'description' - }, - { - gloss: 'Last Modified', - property: 'lastModified' - } - ]; + $scope.weaverTable = { + repo: $scope.ideaRepo, + columns: [{ + gloss: 'Service', + property: 'service.name', + filterable: true, + sortable: true + }, + { + gloss: 'Title', + property: 'title', + filterable: true, + sortable: true + }, + { + gloss: 'Description', + property: 'description', + filterable: true, + sortable: false + }, + { + gloss: 'Last Modified', + property: 'lastModified', + filterable: true, + sortable: true + }, + { + gloss: 'Elevated', + property: 'elevated', + filterable: true, + sortable: true + } + ], + activeSort: [{ + property: 'service.name', + direction: 'ASC' + }, + { + property: 'lastModified', + direction: 'DESC' + } + ] + }; - ServiceRepo.ready().then(function () { + ServiceRepo.ready().then(function() { - $scope.tableParams = IdeaRepo.getTableParams(); + $scope.tableParams = $scope.ideaRepo.getTableParams(); - $scope.resetIdeas = function () { + $scope.resetIdeas = function() { $scope.resetForms($scope.ideaData); $scope.ideaData = new Idea({ title: '', @@ -44,9 +68,9 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur }); - $scope.createIdea = function () { + $scope.createIdea = function() { $scope.creating = true; - IdeaRepo.create($scope.ideaData).then(function (res) { + $scope.ideaRepo.create($scope.ideaData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.creating = false; $scope.resetIdeas(); @@ -54,14 +78,14 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur }); }; - $scope.editIdea = function (idea) { + $scope.editIdea = function(idea) { $scope.ideaData = idea; $scope.openModal('#editIdeaModal'); }; - $scope.updateIdea = function () { + $scope.updateIdea = function() { $scope.updating = true; - IdeaRepo.update($scope.ideaData).then(function (res) { + $scope.ideaRepo.update($scope.ideaData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.updating = false; $scope.resetIdeas(); @@ -69,23 +93,23 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur }); }; - $scope.confirmDelete = function (idea) { + $scope.confirmDelete = function(idea) { $scope.openModal('#deleteIdeaModal'); $scope.ideaToDelete = idea; }; - $scope.deleteIdea = function () { + $scope.deleteIdea = function() { $scope.deleting = true; - $scope.ideaToDelete.delete().then(function () { + $scope.ideaToDelete.delete().then(function() { $scope.closeModal(); $scope.deleting = false; $scope.ideaToDelete = {}; }); }; - $scope.elevateIdea = function (idea) { + $scope.elevateIdea = function(idea) { $scope.elevating = true; - FeatureProposalRepo.elevate(idea).then(function (res) { + FeatureProposalRepo.elevate(idea).then(function(res) { var apiRes = angular.fromJson(res.body); if (apiRes.meta.status === 'SUCCESS') { $scope.elevating = false; @@ -94,7 +118,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur }); }; - $scope.setOverallCheckbox = function () { + $scope.setOverallCheckbox = function() { var overallCheckbox = angular.element('#overallCheckbox')[0]; if ($scope.selectedIdeas.length === 0) { overallCheckbox.indeterminate = false; @@ -108,7 +132,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur } }; - $scope.toggleSelectIdea = function (idea) { + $scope.toggleSelectIdea = function(idea) { if ($scope.isSelectedIdea(idea)) { $scope.removeIdeaFromSelected(idea); } else { @@ -117,7 +141,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur $scope.setOverallCheckbox(); }; - $scope.toggleAll = function () { + $scope.toggleAll = function() { if ($scope.overallCheckboxValue || $scope.anyOnPageSelected()) { for (var i in $scope.ideasTableParams.data) { var ii = $scope.ideasTableParams.data[i]; @@ -136,7 +160,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur $scope.setOverallCheckbox(); }; - $scope.anyOnPageSelected = function () { + $scope.anyOnPageSelected = function() { var anySelected = false; for (var i in $scope.ideasTableParams.data) { var idea = $scope.ideasTableParams.data[i]; @@ -148,7 +172,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur return anySelected; }; - $scope.isSelectedIdea = function (idea) { + $scope.isSelectedIdea = function(idea) { var selected = false; for (var i in $scope.selectedIdeas) { if (idea.id === $scope.selectedIdeas[i].id) { @@ -159,7 +183,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur return selected; }; - $scope.removeIdeaFromSelected = function (idea) { + $scope.removeIdeaFromSelected = function(idea) { for (var i in $scope.selectedIdeas) { if (idea.id === $scope.selectedIdeas[i].id) { $scope.selectedIdeas.splice(i, 1); @@ -168,7 +192,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur } }; - $scope.confirmElevateMultiple = function (ideas) { + $scope.confirmElevateMultiple = function(ideas) { $scope.fpData.ideas = ideas; $scope.fpData.title = ideas[0].title; $scope.fpData.description = ideas[0].description; @@ -176,12 +200,12 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur $scope.openModal('#elevateMultipleModal'); }; - $scope.confirmAddIdea = function (idea) { + $scope.confirmAddIdea = function(idea) { $scope.ideaToAdd = idea; $scope.openModal('#confirmAddIdeaModal'); }; - $scope.addIdea = function (fp) { + $scope.addIdea = function(fp) { fp.ideas.push($scope.ideaToAdd); fp.dirty(true); $scope.updateFeatureProposal(fp); @@ -190,7 +214,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur $scope.ideaToAdd = {}; }; - $scope.setSelectedFp = function (fp) { + $scope.setSelectedFp = function(fp) { $scope.selectedFp = fp; }; diff --git a/app/controllers/managementController.js b/app/controllers/managementController.js index 6b96b37b..62b79f84 100644 --- a/app/controllers/managementController.js +++ b/app/controllers/managementController.js @@ -1,7 +1,30 @@ app.controller('ManagementController', function ($controller, $scope) { - angular.extend(this, $controller('AbstractController', { + angular.extend(this, $controller('AppAbstractController', { $scope: $scope })); + $scope.canManageServices = function () { + return ($scope.hasAdminAccess() || $scope.isServiceManager()); + }; + + $scope.canManageNotes = function () { + return ($scope.hasManagementAccess() && !$scope.isNoticeManager()); + }; + + $scope.canManageIdeas = function () { + return ($scope.hasAdminAccess() || $scope.isServiceManager()); + }; + + $scope.canManageFeatureProposals = function () { + return ($scope.hasAdminAccess() || $scope.isServiceManager()); + }; + + $scope.canManageNotifications = function () { + return ($scope.hasAdminAccess() || $scope.isWebManager() || $scope.isNoticeManager()); + }; + + $scope.canManageUsers = function () { + return $scope.isAdmin(); + }; }); \ No newline at end of file diff --git a/app/controllers/noteController.js b/app/controllers/noteController.js index 2cfd49b5..3e5a6573 100644 --- a/app/controllers/noteController.js +++ b/app/controllers/noteController.js @@ -1,10 +1,10 @@ -app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, ServiceRepo) { +app.controller('NoteController', function($controller, $scope, Note, NoteRepo, ServiceRepo) { angular.extend(this, $controller('AbstractScheduleController', { $scope: $scope })); - - $scope.repo = NoteRepo; + + $scope.noteRepo = NoteRepo; $scope.services = ServiceRepo.getAll(); @@ -43,42 +43,72 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, }, ]; - $scope.filters = [ - { - gloss: 'Service', - property: 'service.name' - }, - { - gloss: 'Title', - property: 'title' - }, - { - gloss: 'Body', - property: 'body' - }, - { - gloss: 'Type', - property: 'noteType' - }, - { - gloss: 'Last Modified', - property: 'lastModified' - }, - { - gloss: 'Pinned', - property: 'pinned' - }, - { - gloss: 'Active', - property: 'active' - } - ]; + $scope.weaverTable = { + repo: $scope.noteRepo, + columns: [{ + gloss: 'Service', + property: 'service.name', + filterable: true, + sortable: true + }, + { + gloss: 'Title', + property: 'title', + filterable: true, + sortable: true + }, + { + gloss: 'Body', + property: 'body', + filterable: true, + sortable: false + }, + { + gloss: 'Type', + property: 'noteType', + filterable: true, + sortable: true + }, + { + gloss: 'Last Modified', + property: 'lastModified', + filterable: true, + sortable: true + }, + { + gloss: 'Pinned', + property: 'pinned', + filterable: true, + sortable: true + }, + { + gloss: 'Active', + property: 'active', + filterable: true, + sortable: true + }, + { + gloss: 'Actions', + filterable: false, + sortable: false + } + ], + activeSort: [{ + property: 'service.name', + direction: 'ASC' + }, + { + property: 'lastModified', + direction: 'DESC' + } + ] + }; - ServiceRepo.ready().then(function () { + ServiceRepo.ready().then(function() { $scope.tableParams = NoteRepo.getTableParams(); - $scope.resetNotes = function () { + $scope.resetNotes = function() { if ($scope.noteData) { $scope.noteData.refresh(); $scope.noteData.clearValidationResults(); @@ -101,44 +131,44 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, $scope.resetNotes(); - $scope.createNote = function () { - NoteRepo.create($scope.noteData).then(function (res) { + $scope.createNote = function() { + $scope.noteRepo.create($scope.noteData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.resetNotes(); } }); }; - $scope.editNote = function (note) { + $scope.editNote = function(note) { $scope.noteData = note; $scope.openModal('#editNoteModal'); }; - $scope.updateNote = function () { - NoteRepo.update($scope.noteData).then(function (res) { + $scope.updateNote = function() { + $scope.noteRepo.update($scope.noteData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.resetNotes(); } }); }; - $scope.editSchedule = function (note) { + $scope.editSchedule = function(note) { $scope.data = note; $scope.openModal('#editScheduleModal'); }; - $scope.resetSchedule = function () { + $scope.resetSchedule = function() { $scope.resetNotes(); }; - $scope.confirmDelete = function (note) { + $scope.confirmDelete = function(note) { $scope.openModal('#deleteNoteModal'); $scope.noteToDelete = note; }; - $scope.deleteNote = function () { + $scope.deleteNote = function() { $scope.deleting = true; - $scope.noteToDelete.delete().then(function () { + $scope.noteToDelete.delete().then(function() { $scope.closeModal(); $scope.deleting = false; $scope.noteToDelete = {}; @@ -154,4 +184,4 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, toolbar: "undo redo | formatselect bold italic separator | alignleft aligncenter alignright | numlist bullist | forecolor backcolor" }; -}); \ No newline at end of file +}); diff --git a/app/controllers/serviceController.js b/app/controllers/serviceController.js index e430d4f2..2ac88ca5 100644 --- a/app/controllers/serviceController.js +++ b/app/controllers/serviceController.js @@ -1,4 +1,4 @@ -app.controller('ServiceController', function ($controller, $route, $scope, ProjectService, Service, ServiceRepo, NgTableParams) { +app.controller('ServiceController', function($controller, $route, $scope, ProjectService, Service, ServiceRepo, NgTableParams) { angular.extend(this, $controller('AbstractScheduleController', { $scope: $scope @@ -9,22 +9,71 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje type: "service", options: ['UP', 'DOWN', 'MAINTENANCE'] }; - + $scope.serviceRepo = ServiceRepo; - $scope.services = ServiceRepo.getAll(); + $scope.services = $scope.serviceRepo.getAll(); $scope.forms = {}; $scope.serviceToDelete = {}; - ProjectService.getAll().then(function (projects) { + $scope.weaverTable = { + repo: $scope.serviceRepo, + columns: [{ + gloss: 'Service', + property: 'name', + filterable: true, + sortable: true + }, + { + gloss: 'Status', + property: 'status', + filterable: true, + sortable: true + }, + { + gloss: 'Auto Updating URL', + property: 'serviceUrl', + filterable: true, + sortable: true + }, + { + gloss: 'Public', + property: 'isPublic', + filterable: true, + sortable: true + }, + { + gloss: 'Short List', + property: 'onShortList', + filterable: true, + sortable: true + }, + { + gloss: 'Project', + filterable: false, + sortable: false + }, + { + gloss: 'Actions', + filterable: false, + sortable: false + } + ], + activeSort: [{ + property: 'name', + direction: 'ASC' + }] + }; + + ProjectService.getAll().then(function(projects) { $scope.projects = projects; - $scope.getProject = function (service) { + $scope.getProject = function(service) { if (service.projectId && !service.project) { service.project = {}; - ProjectService.getById(service.projectId).then(function (project) { + ProjectService.getById(service.projectId).then(function(project) { angular.extend(service, { project: project }); @@ -36,7 +85,7 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje }); - $scope.resetServices = function () { + $scope.resetServices = function() { if ($scope.serviceData) { $scope.serviceData.refresh(); $scope.serviceData.clearValidationResults(); @@ -59,65 +108,54 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje $scope.resetServices(); - $scope.createService = function () { + $scope.createService = function() { if ($scope.serviceData.isAuto) { $scope.serviceData.status = 'UP'; } else { $scope.serviceData.isAuto = false; } - ServiceRepo.create($scope.serviceData).then(function (res) { + $scope.serviceRepo.create($scope.serviceData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.resetServices(); } }); }; - $scope.editService = function (service) { + $scope.editService = function(service) { $scope.serviceData = service; $scope.openModal('#editServiceModal'); }; - $scope.updateService = function () { - ServiceRepo.update($scope.serviceData).then(function (res) { + $scope.updateService = function() { + $scope.serviceRepo.update($scope.serviceData).then(function(res) { if (angular.fromJson(res.body).meta.status === 'SUCCESS') { $scope.resetServices(); } }); }; - $scope.editSchedule = function (service) { + $scope.editSchedule = function(service) { $scope.data = service; $scope.openModal('#editScheduleModal'); }; - $scope.resetSchedule = function () { + $scope.resetSchedule = function() { $scope.resetServices(); }; - var buildTable = function () { - var allServices = ServiceRepo.getAll(); - $scope.tableParams = new NgTableParams({ - count: allServices.length - }, { - counts: [], - filterDelay: 0, - dataset: allServices - }); - }; - - ServiceRepo.ready().then(function () { - buildTable(); - $scope.tableParams.reload(); + ServiceRepo.ready().then(function() { + $scope.tableParams = ServiceRepo.getTableParams(); + $scope.resetServices(); }); - $scope.confirmDelete = function (service) { + $scope.confirmDelete = function(service) { $scope.openModal('#deleteServiceModal'); $scope.serviceToDelete = service; }; - $scope.deleteService = function () { + $scope.deleteService = function() { $scope.deleting = true; - $scope.serviceToDelete.delete().then(function () { + $scope.serviceToDelete.delete().then(function() { $scope.closeModal(); $scope.deleting = false; ServiceRepo.remove($scope.serviceToDelete); @@ -133,4 +171,4 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje toolbar: "undo redo | formatselect bold italic separator | alignleft aligncenter alignright | bullist numlist | forecolor backcolor" }; -}); \ No newline at end of file +}); diff --git a/app/controllers/userRepoController.js b/app/controllers/userRepoController.js index 19b256f9..205cf3d3 100644 --- a/app/controllers/userRepoController.js +++ b/app/controllers/userRepoController.js @@ -7,7 +7,7 @@ app.controller('UserRepoController', function ($controller, $location, $injector $scope.user = UserService.getCurrentUser(); UserService.userReady().then(function () { - if ($scope.isAdmin() || $scope.isManager()) { + if ($scope.hasManagementAccess()) { var UserRepo = $injector.get("UserRepo"); @@ -30,12 +30,12 @@ app.controller('UserRepoController', function ($controller, $location, $injector $scope.allowableRoles = function (userRole) { if (StorageService.get('role') == 'ROLE_ADMIN') { - return ['ROLE_ADMIN', 'ROLE_WEB_MANAGER', 'ROLE_SERVICE_MANAGER', 'ROLE_STAFF', 'ROLE_USER']; - } else if (StorageService.get('role') == 'ROLE_WEB_MANAGER') { + return ['ROLE_ADMIN', 'ROLE_SERVICE_ADMIN', 'ROLE_SERVICE_MANAGER', 'ROLE_WEB_MANAGER', 'ROLE_NOTICE_MANAGER', 'ROLE_STAFF', 'ROLE_USER']; + } else if (StorageService.get('role') == 'ROLE_SERVICE_MANAGER') { if (userRole == 'ROLE_ADMIN') { return ['ROLE_ADMIN']; } - return ['ROLE_WEB_MANAGER', 'ROLE_SERVICE_MANAGER', 'ROLE_STAFF', 'ROLE_USER']; + return ['ROLE_SERVICE_MANAGER', 'ROLE_WEB_MANAGER', 'ROLE_NOTICE_MANAGER', 'ROLE_STAFF', 'ROLE_USER']; } else { return [userRole]; } diff --git a/app/directives/weaverTableDirective.js b/app/directives/weaverTableDirective.js index de0a19bc..81184192 100644 --- a/app/directives/weaverTableDirective.js +++ b/app/directives/weaverTableDirective.js @@ -1,116 +1,114 @@ -app.directive('weaverTable', function ($controller) { - return { - templateUrl: 'views/directives/tableControls.html', - restrict: 'E', - replace: false, - transclude: { - table: 'weaverTableElement', - controls: 'weaverTableControls', - modals: 'weaverTableModals' - }, - scope: false, - link: function ($scope, element, attr) { +app.directive('weaverTable', function() { + return { + templateUrl: 'views/directives/tableControls.html', + restrict: 'E', + replace: false, + transclude: { + table: 'weaverTableElement', + controls: 'weaverTableControls', + modals: 'weaverTableModals' + }, + scope: { + weaverTable: "=" + }, + controller: ['$scope', function($scope) { - if($scope.filters) { + $scope.weaverTable.repo.getPageSettings().sort = []; + + $scope.filters = $scope.weaverTable.columns.filter(function(column) { + return column.filterable; + }); $scope.filter = $scope.filters[0]; - $scope.activeFilters = $scope.repo.getPageSettings().filters; + $scope.activeFilters = $scope.weaverTable.repo.getPageSettings().filters; $scope.selectFilter = function(filter) { $scope.filter = filter; }; - - $scope.removeFilter = function (prop, v) { + + $scope.removeFilter = function(prop, v) { $scope.activeFilters[prop].splice($scope.activeFilters[prop].indexOf(v), 1); - if($scope.activeFilters[prop].length === 0) { + if ($scope.activeFilters[prop].length === 0) { delete $scope.activeFilters[prop]; } - $scope.repo.getTableParams().reload(); + $scope.weaverTable.repo.getTableParams().reload(); }; - + $scope.applyFilter = function(filter) { - if($scope.activeFilters[filter.property]) { + if ($scope.activeFilters[filter.property]) { $scope.activeFilters[filter.property].push(filter.value); } else { $scope.activeFilters[filter.property] = [filter.value]; } - $scope.repo.getTableParams().reload(); + $scope.weaverTable.repo.getTableParams().reload(); delete $scope.filter.value; }; $scope.lookupGloss = function(prop) { - for(var i in $scope.filters) { + for (var i in $scope.filters) { var filter = angular.copy($scope.filters[i]); - if(filter.property === prop) { + if (filter.property === prop) { return filter.gloss; } } }; - } - - var activeSort = $scope.repo.getPageSettings().sort = [{ - property: 'service.name', - direction: 'ASC' - }, { - property: 'lastModified', - direction: 'DESC' - }]; + var activeSort = $scope.weaverTable.repo.getPageSettings().sort = $scope.weaverTable.activeSort; - $scope.unsorted = function(prop) { - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop) { - return false; + $scope.weaverTable.unsorted = function(prop) { + for (var i in activeSort) { + var sort = activeSort[i]; + if (sort.property === prop) { + return false; + } } - } - return true; - }; - - $scope.asc = function(prop) { - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop && sort.direction === 'ASC') { - return true; + return true; + }; + + $scope.weaverTable.asc = function(prop) { + for (var i in activeSort) { + var sort = activeSort[i]; + if (sort.property === prop && sort.direction === 'ASC') { + return true; + } } - } - return false; - }; - - $scope.desc = function(prop) { - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop && sort.direction === 'DESC') { - return true; + return false; + }; + + $scope.weaverTable.desc = function(prop) { + for (var i in activeSort) { + var sort = activeSort[i]; + if (sort.property === prop && sort.direction === 'DESC') { + return true; + } } - } - return false; - }; - - $scope.toggleSort = function(prop) { - var asc = true; - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop) { - if(sort.direction === 'ASC') { - sort.direction = 'DESC'; - } else { - activeSort.splice(i, 1); + return false; + }; + + $scope.weaverTable.toggleSort = function(prop) { + var asc = true; + for (var i in activeSort) { + var sort = activeSort[i]; + if (sort.property === prop) { + if (sort.direction === 'ASC') { + sort.direction = 'DESC'; + } else { + activeSort.splice(i, 1); + } + asc = false; + break; } - asc = false; - break; } - } - if(asc) { - activeSort.push({ - property: prop, - direction: 'ASC' - }); - } - $scope.repo.getTableParams().reload(); - }; + if (asc) { + activeSort.push({ + property: prop, + direction: 'ASC' + }); + } + $scope.weaverTable.repo.getTableParams().reload(); + }; - } - }; + }] + }; }); \ No newline at end of file diff --git a/app/filters/dashboardServicesFilter.js b/app/filters/dashboardServicesFilter.js index ed9688d6..e3c9be64 100644 --- a/app/filters/dashboardServicesFilter.js +++ b/app/filters/dashboardServicesFilter.js @@ -14,9 +14,30 @@ app.filter('dashboardServices', function () { return resultingArr; }; + var filterByStatus = function (arr, filterStatus) { + var filtered = []; + var remaining = []; + + angular.forEach(arr, function (el) { + if (filterStatus.indexOf(el.status) >= 0) { + filtered.push(el); + } + else { + remaining.push(el); + } + }); + + return { + 'filtered': filtered, + 'remaining': remaining + }; + }; + return function (services, options) { var shownServices = reduceArray(services, options.showPublic(), "isPublic"); - return reduceArray(shownServices, options.showShortList, "onShortList"); + var byStatus = filterByStatus(shownServices, ["MAINTENANCE", "DOWN"]); + var shortList = reduceArray(byStatus.remaining, options.showShortList, "onShortList"); + return byStatus.filtered.concat(shortList); }; -}); \ No newline at end of file +}); diff --git a/app/index.html b/app/index.html index e897a1fc..58e20808 100644 --- a/app/index.html +++ b/app/index.html @@ -63,8 +63,8 @@