From 105a321cbfca0f2b80ce7f201678b6795fc29941 Mon Sep 17 00:00:00 2001 From: Ryan Laddusaw Date: Thu, 21 Jun 2018 16:42:52 -0500 Subject: [PATCH 1/4] Scope isolated for table directive --- app/config/apiMapping.js | 5 + app/controllers/serviceController.js | 64 ++++++-- app/directives/weaverTableDirective.js | 215 +++++++++++++++---------- app/repo/serviceRepo.js | 50 +++++- app/views/directives/thContents.html | 7 + app/views/management/services.html | 74 +++++---- 6 files changed, 284 insertions(+), 131 deletions(-) create mode 100644 app/views/directives/thContents.html 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/controllers/serviceController.js b/app/controllers/serviceController.js index e430d4f2..5a3def2e 100644 --- a/app/controllers/serviceController.js +++ b/app/controllers/serviceController.js @@ -18,6 +18,53 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje $scope.serviceToDelete = {}; + $scope.tableConfig = { + properties: [ + { + gloss: 'Service', + property: 'name', + filterable: true, + sortable: true + }, + { + gloss: 'Status', + property: 'status', + filterable: true, + sortable: true + }, + { + gloss: 'Auto Updating', + property: 'isAuto', + filterable: true, + sortable: true + }, + { + gloss: 'Public', + property: 'isPublic', + filterable: true, + sortable: true + }, + { + gloss: 'Short List', + property: 'onShortList', + filterable: true, + sortable: true + }, + { + gloss: 'URL', + property: 'serviceUrl', + filterable: true, + sortable: true + } + ], + activeSort: [ + { + property: 'name', + direction: 'ASC' + } + ] + }; + ProjectService.getAll().then(function (projects) { $scope.projects = projects; @@ -94,20 +141,9 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje $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(); + $scope.tableParams = ServiceRepo.getTableParams(); + $scope.resetServices(); }); $scope.confirmDelete = function (service) { @@ -133,4 +169,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/directives/weaverTableDirective.js b/app/directives/weaverTableDirective.js index de0a19bc..a98c046a 100644 --- a/app/directives/weaverTableDirective.js +++ b/app/directives/weaverTableDirective.js @@ -1,4 +1,4 @@ -app.directive('weaverTable', function ($controller) { +app.directive('weaverTable', function () { return { templateUrl: 'views/directives/tableControls.html', restrict: 'E', @@ -8,109 +8,148 @@ app.directive('weaverTable', function ($controller) { controls: 'weaverTableControls', modals: 'weaverTableModals' }, - scope: false, - link: function ($scope, element, attr) { + scope: { + repo: "=", + weaverTableConfig: "=" + }, + controller: ['$scope', function weaverTableController($scope) { - if($scope.filters) { + $scope.repo.getPageSettings().sort = []; - $scope.filter = $scope.filters[0]; + if($scope.weaverTableConfig.properties) { - $scope.activeFilters = $scope.repo.getPageSettings().filters; + $scope.filters = $scope.weaverTableConfig.properties.map(prop => { + if (prop.filterable) { + return { + gloss: prop.gloss, + property: prop.property + }; + } + }); - $scope.selectFilter = function(filter) { - $scope.filter = filter; - }; - - $scope.removeFilter = function (prop, v) { - $scope.activeFilters[prop].splice($scope.activeFilters[prop].indexOf(v), 1); - if($scope.activeFilters[prop].length === 0) { - delete $scope.activeFilters[prop]; + $scope.filter = $scope.filters[0]; + + $scope.activeFilters = $scope.repo.getPageSettings().filters; + + $scope.selectFilter = function(filter) { + $scope.filter = filter; + }; + + $scope.removeFilter = function (prop, v) { + $scope.activeFilters[prop].splice($scope.activeFilters[prop].indexOf(v), 1); + if($scope.activeFilters[prop].length === 0) { + delete $scope.activeFilters[prop]; + } + $scope.repo.getTableParams().reload(); + }; + + $scope.applyFilter = function(filter) { + if($scope.activeFilters[filter.property]) { + $scope.activeFilters[filter.property].push(filter.value); + } else { + $scope.activeFilters[filter.property] = [filter.value]; + } + $scope.repo.getTableParams().reload(); + delete $scope.filter.value; + }; + + $scope.lookupGloss = function(prop) { + for(var i in $scope.filters) { + var filter = angular.copy($scope.filters[i]); + if(filter.property === prop) { + return filter.gloss; + } + } + }; + + } + + var activeSort = $scope.repo.getPageSettings().sort = $scope.weaverTableConfig.activeSort; + + this.unsorted = function(prop) { + for(var i in activeSort) { + var sort = activeSort[i]; + if(sort.property === prop) { + return false; + } } - $scope.repo.getTableParams().reload(); + return true; }; - - $scope.applyFilter = function(filter) { - if($scope.activeFilters[filter.property]) { - $scope.activeFilters[filter.property].push(filter.value); - } else { - $scope.activeFilters[filter.property] = [filter.value]; + + this.asc = function(prop) { + for(var i in activeSort) { + var sort = activeSort[i]; + if(sort.property === prop && sort.direction === 'ASC') { + return true; + } } - $scope.repo.getTableParams().reload(); - delete $scope.filter.value; + return false; }; - $scope.lookupGloss = function(prop) { - for(var i in $scope.filters) { - var filter = angular.copy($scope.filters[i]); - if(filter.property === prop) { - return filter.gloss; + this.desc = function(prop) { + for(var i in activeSort) { + var sort = activeSort[i]; + if(sort.property === prop && sort.direction === 'DESC') { + return true; } } + return false; }; - } - - var activeSort = $scope.repo.getPageSettings().sort = [{ - property: 'service.name', - direction: 'ASC' - }, { - property: 'lastModified', - direction: 'DESC' - }]; - - $scope.unsorted = function(prop) { - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop) { - return false; + this.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; + } } - } - return true; - }; - - $scope.asc = function(prop) { - for(var i in activeSort) { - var sort = activeSort[i]; - if(sort.property === prop && sort.direction === 'ASC') { - return true; + if(asc) { + activeSort.push({ + property: prop, + direction: 'ASC' + }); } - } - 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.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; + $scope.repo.getTableParams().reload(); + }; + + if (activeSort) { + + if ($scope.weaverTableConfig.properties) { + var result = {}; + $scope.weaverTableConfig.properties.map(prop => { + if (prop.sortable) { + result[prop.property] = prop.gloss; + } + }); + this.sortable = result; } } - if(asc) { - activeSort.push({ - property: prop, - direction: 'ASC' - }); - } - $scope.repo.getTableParams().reload(); - }; + }] + }; +}); - } - }; +app.directive('thContents', function () { + return { + templateUrl: 'views/directives/thContents.html', + restrict: 'E', + replace: true, + require: '^^weaverTable', + scope: { + property: '@' + }, + link: function ($scope, element, attr, parent) { + $scope.toggleSort = parent.toggleSort; + $scope.unsorted = parent.unsorted; + $scope.asc = parent.asc; + $scope.desc = parent.desc; + $scope.sortable = parent.sortable; + } + }; }); \ No newline at end of file diff --git a/app/repo/serviceRepo.js b/app/repo/serviceRepo.js index 927a5141..872efa75 100644 --- a/app/repo/serviceRepo.js +++ b/app/repo/serviceRepo.js @@ -1,7 +1,54 @@ -app.repo("ServiceRepo", function ServiceRepo($q, $timeout, WsApi) { +app.repo("ServiceRepo", function ServiceRepo($q, $timeout, WsApi, Service, TableFactory) { var serviceRepo = this; + serviceRepo.getPageSettings = function () { + return table.getPageSettings(); + }; + + serviceRepo.getTableParams = function () { + return table.getTableParams(); + }; + + serviceRepo.fetchPage = function (pageSettings) { + angular.extend(serviceRepo.mapping.page, { + 'data': pageSettings ? pageSettings : table.getPageSettings() + }); + return WsApi.fetch(serviceRepo.mapping.page); + }; + + var safePage = function(resolve) { + serviceRepo.fetchPage().then(function (response) { + var page = angular.fromJson(response.body).payload.PageImpl; + serviceRepo.empty(); + serviceRepo.addAll(page.content); + if (table.getPageSettings().pageNumber > 1 && table.getPageSettings().pageNumber > page.totalPages) { + table.setPage(page.totalPages); + safePage(resolve); + } else { + resolve(page); + } + }); + }; + + serviceRepo.page = function () { + return $q(function (resolve) { + safePage(resolve); + }); + }; + + var table = TableFactory.buildTable({ + pageNumber: sessionStorage.getItem('services-page') ? sessionStorage.getItem('services-page') : 1, + pageSize: sessionStorage.getItem('services-size') ? sessionStorage.getItem('services-size') : 10, + direction: 'DESC', + properties: ['name'], + filters: {}, + counts: [5, 10, 25, 50, 100], + page: serviceRepo.page, + data: serviceRepo.getContents(), + name: 'services' + }); + var checkCreateNotes = function (service) { if (service.notes === undefined) { service.notes = []; @@ -169,6 +216,7 @@ app.repo("ServiceRepo", function ServiceRepo($q, $timeout, WsApi) { WsApi.listen(serviceRepo.mapping.createListen).then(null, null, function (response) { $timeout(function () { serviceRepo.reset(); + table.getTableParams().reload(); }, 250); }); diff --git a/app/views/directives/thContents.html b/app/views/directives/thContents.html new file mode 100644 index 00000000..50ada862 --- /dev/null +++ b/app/views/directives/thContents.html @@ -0,0 +1,7 @@ +{{sortable[property]}} + + + \ No newline at end of file diff --git a/app/views/management/services.html b/app/views/management/services.html index 633bc698..eef51140 100644 --- a/app/views/management/services.html +++ b/app/views/management/services.html @@ -1,32 +1,50 @@
-
-
-
- -
-
-
+ - - - - - - - - - - - -
{{service.name}} (scheduled){{service.status}}{{service.isAuto}}{{service.isPublic}}{{service.onShortList}}{{service.serviceUrl}}{{getProject(service).name}} - - - -
+ + + - - - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectActions
{{service.name}} (scheduled){{service.status}}{{service.isAuto}}{{service.isPublic}}{{service.onShortList}}{{service.serviceUrl}}{{getProject(service).name}} + + + +
+
+ + + + + + + + + + \ No newline at end of file From fa3f9f37e3666ea0107790674709e1f200d2ebf1 Mon Sep 17 00:00:00 2001 From: Ryan Laddusaw Date: Thu, 21 Jun 2018 17:01:15 -0500 Subject: [PATCH 2/4] Updated ideas, notes, and feature proposals --- app/controllers/featureProposalController.js | 66 ++++++++++----- app/controllers/ideaController.js | 55 +++++++++---- app/controllers/noteController.js | 86 +++++++++++++------- app/views/management/featureProposals.html | 10 +-- app/views/management/ideas.html | 10 +-- app/views/management/notes.html | 14 ++-- 6 files changed, 155 insertions(+), 86 deletions(-) diff --git a/app/controllers/featureProposalController.js b/app/controllers/featureProposalController.js index 4509b1bb..e2e7698c 100644 --- a/app/controllers/featureProposalController.js +++ b/app/controllers/featureProposalController.js @@ -10,28 +10,50 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, $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.tableConfig = { + properties: [ + { + gloss: 'Service', + property: 'service.name', + filterable: true, + sortable: true + }, + { + gloss: 'Title', + property: 'title', + filterable: true, + sortable: true + }, + { + gloss: 'Description', + property: 'description', + filterable: true, + sortable: true + }, + { + gloss: 'Submitted', + property: 'submitted', + filterable: true, + sortable: true + }, + { + gloss: 'Last Modified', + property: 'lastModified', + filterable: true, + sortable: true + } + ], + activeSort: [ + { + property: 'service.name', + direction: 'ASC' + }, + { + property: 'lastModified', + direction: 'DESC' + } + ] + }; $scope.removedIdeas = []; diff --git a/app/controllers/ideaController.js b/app/controllers/ideaController.js index ea139ed9..095c35af 100644 --- a/app/controllers/ideaController.js +++ b/app/controllers/ideaController.js @@ -8,23 +8,44 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur $scope.ideaToDelete = {}; - $scope.filters = [{ - gloss: 'Service', - property: 'service.name' - }, - { - gloss: 'Title', - property: 'title' - }, - { - gloss: 'Description', - property: 'description' - }, - { - gloss: 'Last Modified', - property: 'lastModified' - } - ]; + $scope.tableConfig = { + properties: [ + { + gloss: 'Service', + property: 'service.name', + filterable: true, + sortable: true + }, + { + gloss: 'Title', + property: 'title', + filterable: true, + sortable: true + }, + { + 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 () { diff --git a/app/controllers/noteController.js b/app/controllers/noteController.js index 2cfd49b5..3dcb87c0 100644 --- a/app/controllers/noteController.js +++ b/app/controllers/noteController.js @@ -43,36 +43,62 @@ 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.tableConfig = { + properties: [ + { + 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 + } + ], + activeSort: [ + { + property: 'service.name', + direction: 'ASC' + }, + { + property: 'lastModified', + direction: 'DESC' + } + ] + }; ServiceRepo.ready().then(function () { diff --git a/app/views/management/featureProposals.html b/app/views/management/featureProposals.html index 819e2950..e7c6488c 100644 --- a/app/views/management/featureProposals.html +++ b/app/views/management/featureProposals.html @@ -1,6 +1,6 @@
- + @@ -10,11 +10,11 @@ - - + + - - + + diff --git a/app/views/management/ideas.html b/app/views/management/ideas.html index 7afcec46..7315d12e 100644 --- a/app/views/management/ideas.html +++ b/app/views/management/ideas.html @@ -1,6 +1,6 @@
- + @@ -10,11 +10,11 @@
ServiceTitle DescriptionLast ModifiedSubmitted Actions
- - + + - - + + diff --git a/app/views/management/notes.html b/app/views/management/notes.html index 3960502d..5444729b 100644 --- a/app/views/management/notes.html +++ b/app/views/management/notes.html @@ -1,6 +1,6 @@
- + @@ -10,13 +10,13 @@
ServiceTitle DescriptionLast ModifiedElevated
- - + + - - - - + + + + From 6614ce2a1d9b1330d6ce6d3a4853365534c22e42 Mon Sep 17 00:00:00 2001 From: Ryan Laddusaw Date: Thu, 21 Jun 2018 17:06:31 -0500 Subject: [PATCH 3/4] Replaced arrow functions --- app/directives/weaverTableDirective.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/directives/weaverTableDirective.js b/app/directives/weaverTableDirective.js index a98c046a..121d3a34 100644 --- a/app/directives/weaverTableDirective.js +++ b/app/directives/weaverTableDirective.js @@ -18,7 +18,7 @@ app.directive('weaverTable', function () { if($scope.weaverTableConfig.properties) { - $scope.filters = $scope.weaverTableConfig.properties.map(prop => { + $scope.filters = $scope.weaverTableConfig.properties.map(function(prop) { if (prop.filterable) { return { gloss: prop.gloss, @@ -123,7 +123,7 @@ app.directive('weaverTable', function () { if ($scope.weaverTableConfig.properties) { var result = {}; - $scope.weaverTableConfig.properties.map(prop => { + $scope.weaverTableConfig.properties.map(function (prop) { if (prop.sortable) { result[prop.property] = prop.gloss; } From 5df600a80c4009f57801a27807dfe7af382e858a Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 21 Jun 2018 19:55:21 -0500 Subject: [PATCH 4/4] ng-table custom header --- app/controllers/abstractIdeaController.js | 6 +- app/controllers/featureProposalController.js | 56 +++--- app/controllers/ideaController.js | 65 +++---- app/controllers/noteController.js | 44 ++--- app/controllers/serviceController.js | 64 ++++--- app/directives/weaverTableDirective.js | 165 +++++++----------- app/views/checkbox.html | 1 + app/views/detail/service/ideas.html | 2 +- app/views/directives/tableControls.html | 15 ++ app/views/management/featureProposals.html | 14 +- app/views/management/ideas.html | 16 +- app/views/management/notes.html | 16 +- app/views/management/services.html | 16 +- app/views/management/users.html | 5 +- app/views/modals/addNoteModal.html | 1 + .../modals/detail/service/addFpModal.html | 2 +- 16 files changed, 219 insertions(+), 269 deletions(-) create mode 100644 app/views/checkbox.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/featureProposalController.js b/app/controllers/featureProposalController.js index e2e7698c..4554fdf0 100644 --- a/app/controllers/featureProposalController.js +++ b/app/controllers/featureProposalController.js @@ -1,18 +1,16 @@ -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.tableConfig = { - properties: [ - { + $scope.weaverTable = { + repo: $scope.fpRepo, + columns: [{ gloss: 'Service', property: 'service.name', filterable: true, @@ -28,6 +26,12 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, gloss: 'Description', property: 'description', filterable: true, + sortable: false + }, + { + gloss: 'Last Modified', + property: 'lastModified', + filterable: true, sortable: true }, { @@ -37,14 +41,12 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, sortable: true }, { - gloss: 'Last Modified', - property: 'lastModified', - filterable: true, - sortable: true + gloss: 'Actions', + filterable: false, + sortable: false } ], - activeSort: [ - { + activeSort: [{ property: 'service.name', direction: 'ASC' }, @@ -57,17 +59,17 @@ app.controller('FeatureProposalController', function ($controller, $scope, Idea, $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); @@ -75,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(); @@ -89,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 095c35af..9456b3b3 100644 --- a/app/controllers/ideaController.js +++ b/app/controllers/ideaController.js @@ -1,16 +1,14 @@ -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.tableConfig = { - properties: [ - { + $scope.weaverTable = { + repo: $scope.ideaRepo, + columns: [{ gloss: 'Service', property: 'service.name', filterable: true, @@ -22,6 +20,12 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur filterable: true, sortable: true }, + { + gloss: 'Description', + property: 'description', + filterable: true, + sortable: false + }, { gloss: 'Last Modified', property: 'lastModified', @@ -35,8 +39,7 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur sortable: true } ], - activeSort: [ - { + activeSort: [{ property: 'service.name', direction: 'ASC' }, @@ -47,11 +50,11 @@ app.controller('IdeaController', function ($controller, $scope, $timeout, Featur ] }; - 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: '', @@ -65,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(); @@ -75,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(); @@ -90,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; @@ -115,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; @@ -129,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 { @@ -138,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]; @@ -157,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]; @@ -169,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) { @@ -180,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); @@ -189,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; @@ -197,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); @@ -211,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/noteController.js b/app/controllers/noteController.js index 3dcb87c0..43bf8345 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,9 +43,9 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, }, ]; - $scope.tableConfig = { - properties: [ - { + $scope.weaverTable = { + repo: $scope.noteRepo, + columns: [{ gloss: 'Service', property: 'service.name', filterable: true, @@ -86,10 +86,14 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, property: 'active', filterable: true, sortable: true + }, + { + gloss: 'Actions', + filterable: false, + sortable: false } ], - activeSort: [ - { + activeSort: [{ property: 'service.name', direction: 'ASC' }, @@ -100,11 +104,11 @@ app.controller('NoteController', function ($controller, $scope, Note, NoteRepo, ] }; - 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(); @@ -127,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 = {}; diff --git a/app/controllers/serviceController.js b/app/controllers/serviceController.js index 5a3def2e..f113c106 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,18 +9,18 @@ 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 = {}; - $scope.tableConfig = { - properties: [ - { + $scope.weaverTable = { + repo: $scope.serviceRepo, + columns: [{ gloss: 'Service', property: 'name', filterable: true, @@ -55,23 +55,31 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje property: 'serviceUrl', filterable: true, sortable: true - } - ], - activeSort: [ + }, { - property: 'name', - direction: 'ASC' + gloss: 'Project', + filterable: false, + sortable: false + }, + { + gloss: 'Actions', + filterable: false, + sortable: false } - ] + ], + activeSort: [{ + property: 'name', + direction: 'ASC' + }] }; - ProjectService.getAll().then(function (projects) { + 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 }); @@ -83,7 +91,7 @@ app.controller('ServiceController', function ($controller, $route, $scope, Proje }); - $scope.resetServices = function () { + $scope.resetServices = function() { if ($scope.serviceData) { $scope.serviceData.refresh(); $scope.serviceData.clearValidationResults(); @@ -106,54 +114,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(); }; - ServiceRepo.ready().then(function () { + 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); @@ -169,4 +177,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/directives/weaverTableDirective.js b/app/directives/weaverTableDirective.js index 121d3a34..81184192 100644 --- a/app/directives/weaverTableDirective.js +++ b/app/directives/weaverTableDirective.js @@ -1,107 +1,97 @@ -app.directive('weaverTable', function () { - return { - templateUrl: 'views/directives/tableControls.html', - restrict: 'E', - replace: false, - transclude: { - table: 'weaverTableElement', - controls: 'weaverTableControls', - modals: 'weaverTableModals' - }, - scope: { - repo: "=", - weaverTableConfig: "=" - }, - controller: ['$scope', function weaverTableController($scope) { - - $scope.repo.getPageSettings().sort = []; +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.weaverTableConfig.properties) { + $scope.weaverTable.repo.getPageSettings().sort = []; - $scope.filters = $scope.weaverTableConfig.properties.map(function(prop) { - if (prop.filterable) { - return { - gloss: prop.gloss, - property: prop.property - }; - } - }); + $scope.filters = $scope.weaverTable.columns.filter(function(column) { + return column.filterable; + }); - $scope.filter = $scope.filters[0]; + $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.selectFilter = function(filter) { + $scope.filter = filter; + }; - $scope.removeFilter = function (prop, v) { - $scope.activeFilters[prop].splice($scope.activeFilters[prop].indexOf(v), 1); - if($scope.activeFilters[prop].length === 0) { - delete $scope.activeFilters[prop]; - } - $scope.repo.getTableParams().reload(); - }; + $scope.removeFilter = function(prop, v) { + $scope.activeFilters[prop].splice($scope.activeFilters[prop].indexOf(v), 1); + if ($scope.activeFilters[prop].length === 0) { + delete $scope.activeFilters[prop]; + } + $scope.weaverTable.repo.getTableParams().reload(); + }; - $scope.applyFilter = function(filter) { - if($scope.activeFilters[filter.property]) { - $scope.activeFilters[filter.property].push(filter.value); - } else { - $scope.activeFilters[filter.property] = [filter.value]; - } - $scope.repo.getTableParams().reload(); - delete $scope.filter.value; - }; + $scope.applyFilter = function(filter) { + if ($scope.activeFilters[filter.property]) { + $scope.activeFilters[filter.property].push(filter.value); + } else { + $scope.activeFilters[filter.property] = [filter.value]; + } + $scope.weaverTable.repo.getTableParams().reload(); + delete $scope.filter.value; + }; - $scope.lookupGloss = function(prop) { - for(var i in $scope.filters) { - var filter = angular.copy($scope.filters[i]); - if(filter.property === prop) { - return filter.gloss; - } + $scope.lookupGloss = function(prop) { + for (var i in $scope.filters) { + var filter = angular.copy($scope.filters[i]); + if (filter.property === prop) { + return filter.gloss; } - }; - - } + } + }; - var activeSort = $scope.repo.getPageSettings().sort = $scope.weaverTableConfig.activeSort; + var activeSort = $scope.weaverTable.repo.getPageSettings().sort = $scope.weaverTable.activeSort; - this.unsorted = function(prop) { - for(var i in activeSort) { + $scope.weaverTable.unsorted = function(prop) { + for (var i in activeSort) { var sort = activeSort[i]; - if(sort.property === prop) { + if (sort.property === prop) { return false; } } return true; }; - this.asc = function(prop) { - for(var i in activeSort) { + $scope.weaverTable.asc = function(prop) { + for (var i in activeSort) { var sort = activeSort[i]; - if(sort.property === prop && sort.direction === 'ASC') { + if (sort.property === prop && sort.direction === 'ASC') { return true; } } return false; }; - this.desc = function(prop) { - for(var i in activeSort) { + $scope.weaverTable.desc = function(prop) { + for (var i in activeSort) { var sort = activeSort[i]; - if(sort.property === prop && sort.direction === 'DESC') { + if (sort.property === prop && sort.direction === 'DESC') { return true; } } return false; }; - this.toggleSort = function(prop) { + $scope.weaverTable.toggleSort = function(prop) { var asc = true; - for(var i in activeSort) { + for (var i in activeSort) { var sort = activeSort[i]; - if(sort.property === prop) { - if(sort.direction === 'ASC') { + if (sort.property === prop) { + if (sort.direction === 'ASC') { sort.direction = 'DESC'; } else { activeSort.splice(i, 1); @@ -110,46 +100,15 @@ app.directive('weaverTable', function () { break; } } - if(asc) { + if (asc) { activeSort.push({ property: prop, direction: 'ASC' }); } - $scope.repo.getTableParams().reload(); + $scope.weaverTable.repo.getTableParams().reload(); }; - if (activeSort) { - - if ($scope.weaverTableConfig.properties) { - var result = {}; - $scope.weaverTableConfig.properties.map(function (prop) { - if (prop.sortable) { - result[prop.property] = prop.gloss; - } - }); - this.sortable = result; - } - } }] }; -}); - -app.directive('thContents', function () { - return { - templateUrl: 'views/directives/thContents.html', - restrict: 'E', - replace: true, - require: '^^weaverTable', - scope: { - property: '@' - }, - link: function ($scope, element, attr, parent) { - $scope.toggleSort = parent.toggleSort; - $scope.unsorted = parent.unsorted; - $scope.asc = parent.asc; - $scope.desc = parent.desc; - $scope.sortable = parent.sortable; - } - }; }); \ No newline at end of file diff --git a/app/views/checkbox.html b/app/views/checkbox.html new file mode 100644 index 00000000..e05627b4 --- /dev/null +++ b/app/views/checkbox.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/views/detail/service/ideas.html b/app/views/detail/service/ideas.html index dc037bcc..e40699ae 100644 --- a/app/views/detail/service/ideas.html +++ b/app/views/detail/service/ideas.html @@ -5,7 +5,7 @@
ServiceTitle BodyTypeLast ModifiedPinnedActive Actions
- diff --git a/app/views/directives/tableControls.html b/app/views/directives/tableControls.html index d1bc7d07..36f753f1 100644 --- a/app/views/directives/tableControls.html +++ b/app/views/directives/tableControls.html @@ -1,3 +1,18 @@ + +
diff --git a/app/views/management/featureProposals.html b/app/views/management/featureProposals.html index e7c6488c..25cbe92c 100644 --- a/app/views/management/featureProposals.html +++ b/app/views/management/featureProposals.html @@ -1,23 +1,13 @@
- + -
+ {{idea.title}}
- - - - - - - - - - +
DescriptionActions
diff --git a/app/views/management/ideas.html b/app/views/management/ideas.html index 7315d12e..974a3a76 100644 --- a/app/views/management/ideas.html +++ b/app/views/management/ideas.html @@ -1,27 +1,17 @@
- + -
{{fp.service.name}}
- - - - - - - - - - +
Description
- + diff --git a/app/views/management/notes.html b/app/views/management/notes.html index 5444729b..cfc31634 100644 --- a/app/views/management/notes.html +++ b/app/views/management/notes.html @@ -1,25 +1,13 @@
- + -
{{idea.service.name}} (scheduled){{idea.title}}{{idea.title}} {{idea.description}} {{idea.lastModified | date : 'medium'}} {{idea.elevated}}
- - - - - - - - - - - - +
BodyActions
diff --git a/app/views/management/services.html b/app/views/management/services.html index eef51140..33da5de6 100644 --- a/app/views/management/services.html +++ b/app/views/management/services.html @@ -1,25 +1,13 @@
- + -
{{note.service.name}} (scheduled)
- - - - - - - - - - - - +
ProjectActions
diff --git a/app/views/management/users.html b/app/views/management/users.html index 99eceb53..1a0520eb 100644 --- a/app/views/management/users.html +++ b/app/views/management/users.html @@ -29,8 +29,8 @@

Users

@@ -39,5 +39,4 @@

Users

- \ No newline at end of file diff --git a/app/views/modals/addNoteModal.html b/app/views/modals/addNoteModal.html index fba0fb13..5a1b6429 100644 --- a/app/views/modals/addNoteModal.html +++ b/app/views/modals/addNoteModal.html @@ -6,6 +6,7 @@ + - +
{{service.name}} (scheduled) {{thisUser.role}} + +