github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/public/static/js/version_admin.js (about) 1 mciModule.controller('AdminOptionsCtrl', ['$scope', '$rootScope', 'mciVersionsRestService','notificationService', '$filter', function($scope, $rootScope, versionRestService, notifier, $filter) { 2 3 $scope.adminOptionVals = {}; 4 $scope.modalTitle = 'Modify Version'; 5 $scope.selection = "completed"; 6 $scope.collapsedBuilds = {}; 7 8 $scope.checkedForRestartIds = function(){ 9 return _.pluck($scope.version.Builds.map( 10 function(x){ 11 return x.Build.tasks.filter(function(y){return y.checkedForRestart}); 12 } 13 ).reduce(function(x,y){return x.concat(y)}, []), "id"); 14 } 15 16 $scope.numToBeRestarted = function(build_id){ 17 var buildFilter = function(){return true;}; 18 if(build_id){ // if specified, only count the number checked in the given build 19 buildFilter = function(x){return x.Build._id == build_id}; 20 } 21 // count the number of checked items in the tasks from the 22 // filtered set of builds 23 return $scope.version.Builds.filter(buildFilter).map( 24 function(x){ 25 return x.Build.tasks.filter(function(y){return y.checkedForRestart}).length; 26 } 27 ).reduce(function(x,y){return x+y}, 0); 28 } 29 30 $scope.setRestartSelection = function(s){ 31 $scope.selection = s; 32 if($scope.selection == "") { 33 return; 34 } 35 for(var j=0;j<$scope.version.Builds.length;j++){ 36 for(var i=0;i<$scope.version.Builds[j].Build.tasks.length;i++){ 37 var t = $scope.version.Builds[j].Build.tasks[i]; 38 var setting = false; 39 if(s == "none"){ 40 // do nothing (everything gets unchecked) 41 }else if(s == "all"){ 42 setting = true; 43 }else if(t.status != "undispatched" && t.status == "failed"){ 44 if(s == "failures"){ 45 setting = true; 46 }else if (s == "system-failures" && $filter("statusFilter")(t) =="system-failed"){ 47 setting = true; 48 } 49 } 50 $scope.version.Builds[j].Build.tasks[i].checkedForRestart = setting; 51 } 52 } 53 } 54 55 $scope.restart = function() { 56 versionRestService.takeActionOnVersion( 57 $scope.version.Version.id, 58 'restart', 59 { 60 abort: $scope.adminOptionVals.abort, 61 task_ids: $scope.checkedForRestartIds() 62 }, 63 { 64 success: function(data, status) { 65 $scope.closeAdminModal() 66 $rootScope.$broadcast("version_updated", data) 67 notifier.pushNotification( "Selected tasks are restarted.", 'notifyHeader', 'success'); 68 }, 69 error: function(jqXHR, status, errorThrown) { 70 notifier.pushNotification('Error restarting build: ' + jqXHR,'errorModal'); 71 } 72 } 73 ); 74 }; 75 76 function setVersionActive(active, abort) { 77 versionRestService.takeActionOnVersion( 78 $scope.version.Version.id, 79 'set_active', 80 { active: active, abort: abort }, 81 { 82 success: function(data, status) { 83 $scope.closeAdminModal() 84 $rootScope.$broadcast("version_updated", data) 85 notifier.pushNotification( 86 "Version " + (active ? "scheduled." : "unscheduled.") + 87 (abort ? "\n In progress tasks will be aborted." : ""), 88 'notifyHeader', 'success'); 89 }, 90 error: function(jqXHR, status, errorThrown) { 91 notifier.pushNotification('Error setting version activation: ' + jqXHR,'errorModal'); 92 } 93 } 94 ); 95 } 96 function setVersionPriority(newPriority) { 97 versionRestService.takeActionOnVersion( 98 $scope.version.Version.id, 99 'set_priority', 100 { priority: newPriority }, 101 { 102 success: function(data, status) { 103 $scope.closeAdminModal() 104 $rootScope.$broadcast("version_updated", data) 105 var msg = "Priority for version set to " + newPriority + "." 106 notifier.pushNotification(msg, 'notifyHeader', 'success'); 107 }, 108 error: function(jqXHR, status, errorThrown) { 109 notifier.pushNotification('Error changing priority: ' + jqXHR,'errorModal'); 110 } 111 } 112 ); 113 } 114 115 $scope.updateScheduled = function(isActive) { 116 var abortSet = $scope.adminOptionVals.abort ? true : false 117 // only read in the abort checkbox if we are setting active to false 118 var abortVersion = isActive ? false : abortSet; 119 setVersionActive(isActive, abortVersion); 120 } 121 122 $scope.updatePriority = function() { 123 var newPriority = parseInt($scope.adminOptionVals.priority); 124 if(isNaN(newPriority)) { 125 notifier.pushNotification('New priority value must be an integer','errorModal'); 126 } else { 127 setVersionPriority(parseInt($scope.adminOptionVals.priority)); 128 } 129 } 130 131 $scope.closeAdminModal = function() { 132 var modal = $('#admin-modal').modal('hide'); 133 } 134 135 $scope.openAdminModal = function(opt) { 136 $scope.adminOption = opt 137 var modal = $('#admin-modal').modal('show'); 138 139 if (opt === "priority") { 140 modal.on('shown.bs.modal', function() { 141 $('#input-priority').focus(); 142 $scope.modalOpen = true; 143 }); 144 145 modal.on('hide.bs.modal', function() { 146 $scope.modalOpen = false; 147 }); 148 } else { 149 modal.on('shown.bs.modal', function() { 150 $scope.modalOpen = true; 151 }); 152 153 modal.on('hide.bs.modal', function() { 154 $scope.modalOpen = false; 155 }); 156 } 157 158 $(document).keyup(function(ev) { 159 if ($scope.modalOpen && ev.keyCode === 13) { 160 if ($scope.adminOption === 'unschedule') { 161 $scope.updateScheduled(false); 162 $('#admin-modal').modal('hide'); 163 } else if ($scope.adminOption === 'schedule') { 164 $scope.updateScheduled(true); 165 $('#admin-modal').modal('hide'); 166 } 167 } 168 }); 169 } 170 171 $scope.setRestartSelection('all'); 172 }]); 173 174 mciModule.directive('adminRestartVersion', function() { 175 return { 176 restrict: 'E', 177 templateUrl: '/static/partials/admin-restart-version.html', 178 } 179 }); 180 181 182 mciModule.directive('adminScheduleAll', function() { 183 return { 184 restrict: 'E', 185 template: 186 '<div class="row">' + 187 '<div class="col-lg-12">' + 188 'Schedule all tasks?' + 189 '<button type="button" class="btn btn-danger" style="float: right;" data-dismiss="modal">Cancel</button>' + 190 '<button type="button" class="btn btn-primary" style="float: right; margin-right: 10px;" ng-click="updateScheduled(true)">Yes</button>' + 191 '</div>' + 192 '</div>' 193 } 194 }); 195 196 mciModule.directive('adminUnscheduleAll', function() { 197 return { 198 restrict: 'E', 199 template: 200 '<div class="row">' + 201 '<div class="col-lg-12">' + 202 '<div>' + 203 'Unschedule all tasks?' + 204 '<div style="float:right">' + 205 '<button type="button" class="btn btn-danger" style="float: right;" data-dismiss="modal">Cancel</button>' + 206 '<button type="button" class="btn btn-primary" style="float: right; margin-right: 10px;" ng-click="updateScheduled(false)">Yes</button>' + 207 '</div>' + 208 '</div>' + 209 '<div styl="float:right">' + 210 '<input type="checkbox" id="passed" name="passed" ng-model="adminOptionVals.abort" class="ng-valid ng-dirty"> ' + 211 '<label for="passed" style="font-weight:normal;font-size:.8em;"> Abort tasks that have already started</label>' + 212 '</div>' + 213 '</div>' 214 } 215 }); 216 217 mciModule.directive('adminSetPriority', function() { 218 return { 219 restrict: 'E', 220 template: 221 '<div class="row">' + 222 '<div class="col-lg-12">' + 223 'Set new priority = ' + 224 '<form style="display: inline" ng-submit="updatePriority()">' + 225 '<input type="text" id="input-priority" placeholder="number" ng-model="adminOptionVals.priority">' + 226 '</form>' + 227 '<button type="submit" class="btn btn-primary" style="float: right; margin-left: 10px;" ng-click="updatePriority()">Set</button>' + 228 '</div>' + 229 '</div>' 230 } 231 }); 232