github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/public/static/js/projects.js (about) 1 mciModule.controller('ProjectCtrl', function($scope, $window, $http, $location) { 2 3 $scope.availableTriggers = $window.availableTriggers 4 $scope.userId = $window.user.Id; 5 $scope.isAdmin = $window.isSuperUser || $window.isAdmin; 6 7 8 $scope.projectVars = {}; 9 $scope.projectRef = {}; 10 $scope.displayName = ""; 11 12 $scope.projectView = false; 13 14 $scope.settingsFormData = {}; 15 $scope.saveMessage = ""; 16 17 $scope.modalTitle = 'New Project'; 18 $scope.modalOpen = false; 19 $scope.newProject = {}; 20 $scope.newProjectMessage=""; 21 22 $scope.isDirty = false; 23 24 25 // refreshTrackedProjects will populate the list of projects that should be displayed 26 // depending on the user. 27 $scope.refreshTrackedProjects = function(trackedProjects) { 28 $scope.trackedProjects = trackedProjects 29 $scope.enabledProjects = _.filter($scope.trackedProjects, _.property('enabled')); 30 $scope.disabledProjects = _.filter($scope.trackedProjects, _.negate(_.property('enabled'))); 31 }; 32 33 34 $scope.refreshTrackedProjects($window.allTrackedProjects); 35 36 $scope.showProject = function(project) { 37 return !(project.length == 0); 38 } 39 40 $scope.isBatchTimeValid = function(t){ 41 if(t==''){ 42 return true 43 } 44 return !isNaN(Number(t)) && Number(t) >= 0 45 } 46 47 $scope.isValidAlertDefinition = function(spec) { 48 if (spec.startsWith("JIRA:") && spec.split(":").length < 3) { 49 return false 50 } 51 return true 52 } 53 54 $scope.addAlert = function(obj, trigger){ 55 if(!$scope.settingsFormData.alert_config) { 56 $scope.settingsFormData.alert_config = {} 57 } 58 if(!$scope.settingsFormData.alert_config[trigger.id]){ 59 $scope.settingsFormData.alert_config[trigger.id] = [] 60 } 61 $scope.settingsFormData.alert_config[trigger.id].push(NewAlert(obj.email)) 62 obj.editing = false 63 } 64 65 $scope.getProjectAlertConfig = function(t){ 66 if(!$scope.settingsFormData.alert_config || !$scope.settingsFormData.alert_config[t]){ 67 return [] 68 } 69 return $scope.settingsFormData.alert_config[t] 70 } 71 72 $scope.findProject = function(identifier){ 73 return _.find($scope.trackedProjects, function(project){ 74 return project.identifier == identifier; 75 }) 76 } 77 78 $scope.openAlertModal = function(){ 79 var modal = $('#alert-modal').modal('show'); 80 } 81 82 $scope.openAdminModal = function(opt) { 83 var modal = $('#admin-modal').modal('show'); 84 $scope.newProjectMessage = ""; 85 if (opt === 'newProject') { 86 $('#project-name').focus(); 87 modal.on('shown.bs.modal', function() { 88 $scope.modalOpen = true; 89 }); 90 91 modal.on('hide.bs.modal', function() { 92 $scope.modalOpen = false; 93 }); 94 } 95 }; 96 97 // addAdmin adds an admin name to the settingsFormData's list of admins 98 $scope.addAdmin = function(){ 99 $scope.settingsFormData.admins.push($scope.admin_name); 100 $scope.admin_name = ""; 101 } 102 103 // removeAdmin removes the username located at index 104 $scope.removeAdmin = function(index){ 105 $scope.settingsFormData.admins.splice(index, 1); 106 $scope.isDirty = true; 107 } 108 109 110 $scope.addProject = function() { 111 $scope.modalOpen = false; 112 $('#admin-modal').modal('hide'); 113 114 if ($scope.findProject($scope.newProject.identifier)) { 115 console.log("project identifier already exists"); 116 $scope.newProjectMessage = "Project name already exists."; 117 $scope.newProject = {}; 118 return; 119 } 120 $http.put('/project/' + $scope.newProject.identifier, $scope.newProject) 121 .success(function(data, status) { 122 $scope.refreshTrackedProjects(data.AllProjects); 123 $scope.loadProject(data.ProjectId); 124 $scope.newProject = {}; 125 }) 126 .error(function(data, status){ 127 console.log(status); 128 }); 129 130 }; 131 132 $scope.loadProject = function(projectId) { 133 $http.get('/project/' + projectId) 134 .success(function(data, status){ 135 $scope.projectView = true; 136 $scope.projectRef = data.ProjectRef; 137 $scope.projectVars = data.ProjectVars.vars || {}; 138 $scope.privateVars = data.ProjectVars.private_vars || {}; 139 140 $scope.settingsFormData = { 141 identifier : $scope.projectRef.identifier, 142 project_vars: $scope.projectVars, 143 private_vars: $scope.privateVars, 144 display_name : $scope.projectRef.display_name, 145 remote_path:$scope.projectRef.remote_path, 146 batch_time: parseInt($scope.projectRef.batch_time), 147 deactivate_previous: $scope.projectRef.deactivate_previous, 148 relative_url: $scope.projectRef.relative_url, 149 branch_name: $scope.projectRef.branch_name, 150 owner_name: $scope.projectRef.owner_name, 151 repo_name: $scope.projectRef.repo_name, 152 enabled: $scope.projectRef.enabled, 153 private: $scope.projectRef.private, 154 alert_config: $scope.projectRef.alert_config || {}, 155 repotracker_error: $scope.projectRef.repotracker_error || {}, 156 admins : $scope.projectRef.admins || [], 157 }; 158 159 $scope.displayName = $scope.projectRef.display_name ? $scope.projectRef.display_name : $scope.projectRef.identifier; 160 $location.hash($scope.projectRef.identifier); 161 $scope.$emit('loadProject', $scope.projectRef.identifier, $scope.displayName); 162 }) 163 .error(function(data, status) { 164 console.log(status); 165 }); 166 }; 167 168 $scope.$on('$locationChangeStart', function(event) { 169 $scope.hashLoad(); 170 }); 171 172 $scope.hashLoad = function() { 173 var projectHash = $location.hash(); 174 if (projectHash) { 175 // If the project in the hash exists and is not the current project, load it. 176 if ( _.contains(_.pluck($scope.trackedProjects, "identifier"), projectHash) && ($scope.projectRef.identifier != projectHash)) { 177 $scope.loadProject(projectHash); 178 } 179 } 180 } 181 182 $scope.valueString = function(name,value) { 183 if($scope.privateVars[name]){ 184 return '{REDACTED}'; 185 } 186 return value; 187 } 188 189 $scope.shouldHighlight = function(project) { 190 if ($scope.projectRef) { 191 return project.identifier == $scope.projectRef.identifier; 192 } 193 return false; 194 } 195 196 $scope.saveProject = function() { 197 $scope.settingsFormData.batch_time = parseInt($scope.settingsFormData.batch_time) 198 if ($scope.proj_var) { 199 $scope.addProjectVar(); 200 } 201 if ($scope.admin_name) { 202 $scope.addAdmin(); 203 } 204 $http.post('/project/' + $scope.settingsFormData.identifier, $scope.settingsFormData). 205 success(function(data, status) { 206 $scope.saveMessage = "Settings Saved."; 207 $scope.refreshTrackedProjects(data.AllProjects); 208 $scope.settingsForm.$setPristine(); 209 $scope.isDirty = false; 210 }). 211 error(function(data, status, errorThrown) { 212 console.log(status); 213 }); 214 }; 215 216 $scope.addProjectVar = function() { 217 if ($scope.proj_var.name && $scope.proj_var.value) { 218 $scope.settingsFormData.project_vars[$scope.proj_var.name] = $scope.proj_var.value; 219 if ($scope.proj_var.is_private) { 220 $scope.settingsFormData.private_vars[$scope.proj_var.name] = true; 221 } 222 223 $scope.proj_var.name=""; 224 $scope.proj_var.value=""; 225 $scope.proj_var.is_private=false; 226 } 227 }; 228 229 $scope.removeProjectVar = function(name) { 230 delete $scope.settingsFormData.project_vars[name]; 231 delete $scope.settingsFormData.private_vars[name]; 232 $scope.isDirty = true; 233 }; 234 235 $scope.$watch("settingsForm.$dirty", function(dirty) { 236 if (dirty){ 237 $scope.saveMessage = "You have unsaved changes."; 238 $scope.isDirty = true; 239 } 240 }); 241 242 $scope.getAlertDisplay =function(alertObj){ 243 if(alertObj.provider=='email'){ 244 return "Send an e-mail to " + alertObj.settings.recipient 245 } 246 if (alertObj.provider=='jira'){ 247 return "File a "+alertObj.settings.issue+" JIRA ticket in "+ alertObj.settings.project 248 } 249 return 'unknown' 250 } 251 252 $scope.removeAlert = function(triggerId, index){ 253 $scope.settingsFormData.alert_config[triggerId].splice(index, 1) 254 $scope.isDirty = true; 255 } 256 257 $scope.isValidMergeBaseRevision = function(revision){ 258 return revision.length >= 40; 259 } 260 261 $scope.setLastRevision = function() { 262 if ($scope.settingsFormData.repotracker_error.exists) { 263 var revisionUrl = '/project/' + $scope.settingsFormData.identifier + "/repo_revision"; 264 if (!$scope.isValidMergeBaseRevision($scope.settingsFormData.repotracker_error.merge_base_revision)){ 265 console.log("bad revision"); 266 return; 267 } 268 $http.put(revisionUrl, $scope.settingsFormData.repotracker_error.merge_base_revision). 269 success(function(data, status) { 270 $scope.settingsFormData.repotracker_error.exists = false; 271 }). 272 error(function(data, status, errorThrown){ 273 console.log(status); 274 }) 275 } 276 } 277 278 $scope.validKeyValue = function(keyName, value){ 279 if (!(keyName)){ 280 $scope.invalidKeyMessage = ""; 281 return false; 282 } 283 284 if (keyName.indexOf(".") != -1){ 285 $scope.invalidKeyMessage = "Project variable keys cannot have dots in them"; 286 return false; 287 }; 288 289 if (!(value)){ 290 $scope.invalidKeyMessage = ""; 291 return false; 292 } 293 return true; 294 } 295 296 }); 297 298 mciModule.directive('adminNewProject', function() { 299 return { 300 restrict: 'E', 301 template: 302 '<div class="row">' + 303 '<div class="col-lg-12">' + 304 'Enter project name ' + 305 '<form style="display: inline" ng-submit="addProject()">' + 306 '<input type="text" id="project-name" placeholder="project name" ng-model="newProject.identifier">' + 307 '</form>' + 308 '<button type="submit" class="btn btn-primary" style="float: right; margin-left: 10px;" ng-click="addProject()">Create Project</button>' + 309 '</div>' + 310 '</div>' 311 }; 312 }); 313 314 mciModule.directive('adminNewAlert', function() { 315 return { 316 restrict: 'E', 317 templateUrl:'/static/partials/alert_modal_form.html', 318 link: function(scope, element, attrs){ 319 scope.availableTriggers= [ 320 {id:"task_failed", display:"Any task fails..."}, 321 {id:"first_task_failed", display:"The first failure in a version occurs..."}, 322 {id:"task_fail_transition", display:"A task that had passed in a previous run fails"}, 323 ] 324 scope.availableActions= [ 325 {id:"email", display:"Send an e-mail"}, 326 ] 327 scope.setTrigger = function(index){ 328 scope.currentTrigger = scope.availableTriggers[index] 329 } 330 scope.currentTrigger = scope.availableTriggers[0] 331 } 332 }; 333 });