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  });