Merge pull request #9848 from JMAConsulting/CRM-8526
[civicrm-core.git] / ang / crmCaseType.js
index e5aae2a3516ab068056a6c2f620bcf4fca969282..d1765d5c4ca3bcccfbf5af0d863c4b3131f3cdd9 100644 (file)
           apiCalls: function($route, crmApi) {
             var reqs = {};
             reqs.actStatuses = ['OptionValue', 'get', {
-              option_group_id: 'activity_status'
+              option_group_id: 'activity_status',
+              sequential: 1,
+              options: {limit: 0}
+            }];
+            reqs.caseStatuses = ['OptionValue', 'get', {
+              option_group_id: 'case_status',
+              sequential: 1,
+              options: {limit: 0}
             }];
             reqs.actTypes = ['OptionValue', 'get', {
               option_group_id: 'activity_type',
+              sequential: 1,
               options: {
                 sort: 'name',
                 limit: 0
               }
             }];
             reqs.relTypes = ['RelationshipType', 'get', {
+              sequential: 1,
               options: {
                 sort: CRM.crmCaseType.REL_TYPE_CNAME,
                 limit: 0
       restrict: 'AE',
       template: '<input class="add-activity crm-action-menu fa-plus" type="hidden" />',
       link: function(scope, element, attrs) {
-        /// Format list of options for select2's "data"
-        var getFormattedOptions = function() {
-          return {
-            results: _.map(scope[attrs.crmOptions], function(option){
-              return {id: option, text: option};
-            })
-          };
-        };
 
         var input = $('input', element);
 
           scope[attrs.crmVar] = '';
         };
 
-        $(input).select2({
-          data: getFormattedOptions,
+        $(input).crmSelect2({
+          data: scope[attrs.crmOptions],
           createSearchChoice: function(term) {
-            return {id: term, text: term};
+            return {id: term, text: term + ' (' + ts('new') + ')'};
           },
+          createSearchChoicePosition: 'bottom',
           placeholder: attrs.placeholder
         });
         $(input).on('select2-selecting', function(e) {
         });
 
         scope.$watch(attrs.crmOptions, function(value) {
-          $(input).select2('data', getFormattedOptions);
+          $(input).select2('data', scope[attrs.crmOptions]);
           $(input).select2('val', '');
         });
       }
   });
 
   crmCaseType.controller('CaseTypeCtrl', function($scope, crmApi, apiCalls) {
-    var ts = $scope.ts = CRM.ts(null);
+    // CRM_Case_XMLProcessor::REL_TYPE_CNAME
+    var REL_TYPE_CNAME = CRM.crmCaseType.REL_TYPE_CNAME,
+
+    ts = $scope.ts = CRM.ts(null);
 
-    $scope.activityStatuses = _.values(apiCalls.actStatuses.values);
-    $scope.activityTypes = apiCalls.actTypes.values;
-    $scope.activityTypeNames = _.pluck(apiCalls.actTypes.values, 'name');
-    $scope.activityTypes = apiCalls.actTypes.values;
-    $scope.relationshipTypeNames = _.pluck(apiCalls.relTypes.values, CRM.crmCaseType.REL_TYPE_CNAME); // CRM_Case_XMLProcessor::REL_TYPE_CNAME
+    $scope.activityStatuses = apiCalls.actStatuses.values;
+    $scope.caseStatuses = _.indexBy(apiCalls.caseStatuses.values, 'name');
+    $scope.activityTypes = _.indexBy(apiCalls.actTypes.values, 'name');
+    $scope.activityTypeOptions = _.map(apiCalls.actTypes.values, formatActivityTypeOption);
+    $scope.relationshipTypeOptions = _.map(apiCalls.relTypes.values, function(type) {
+      return {id: type[REL_TYPE_CNAME], text: type.label_b_a};
+    });
     $scope.locks = {caseTypeName: true, activitySetName: true};
 
     $scope.workflows = {
     $scope.caseType.definition.activityTypes = $scope.caseType.definition.activityTypes || [];
     $scope.caseType.definition.activitySets = $scope.caseType.definition.activitySets || [];
     $scope.caseType.definition.caseRoles = $scope.caseType.definition.caseRoles || [];
-    window.ct = $scope.caseType;
+    $scope.caseType.definition.statuses = $scope.caseType.definition.statuses || [];
+
+    $scope.selectedStatuses = {};
+    _.each(apiCalls.caseStatuses.values, function (status) {
+      $scope.selectedStatuses[status.name] = !$scope.caseType.definition.statuses.length || $scope.caseType.definition.statuses.indexOf(status.name) > -1;
+    });
 
     $scope.addActivitySet = function(workflow) {
       var activitySet = {};
       });
     };
 
-    /// Add a new activity entry to an activity-set
-    $scope.addActivity = function(activitySet, activityType) {
+    function formatActivityTypeOption(type) {
+      return {id: type.name, text: type.label, icon: type.icon};
+    }
+
+    function addActivityToSet(activitySet, activityTypeName) {
       activitySet.activityTypes.push({
-        name: activityType,
+        name: activityTypeName,
         status: 'Scheduled',
         reference_activity: 'Open Case',
         reference_offset: '1',
         reference_select: 'newest'
       });
-      if (!_.contains($scope.activityTypeNames, activityType)) {
-        $scope.activityTypeNames.push(activityType);
+    }
+
+    function createActivity(name, callback) {
+      CRM.loadForm(CRM.url('civicrm/admin/options/activity_type', {action: 'add', reset: 1, label: name, component_id: 7}))
+        .on('crmFormSuccess', function(e, data) {
+          $scope.activityTypes[data.optionValue.name] = data.optionValue;
+          $scope.activityTypeOptions.push(formatActivityTypeOption(data.optionValue));
+          callback(data.optionValue);
+          $scope.$digest();
+        });
+    }
+
+    // Add a new activity entry to an activity-set
+    $scope.addActivity = function(activitySet, activityType) {
+      if ($scope.activityTypes[activityType]) {
+        addActivityToSet(activitySet, activityType);
+      } else {
+        createActivity(activityType, function(newActivity) {
+          addActivityToSet(activitySet, newActivity.name);
+        });
       }
     };
 
     $scope.addActivityType = function(activityType) {
       var names = _.pluck($scope.caseType.definition.activityTypes, 'name');
       if (!_.contains(names, activityType)) {
-        $scope.caseType.definition.activityTypes.push({
-          name: activityType
-        });
-
-      }
-      if (!_.contains($scope.activityTypeNames, activityType)) {
-        $scope.activityTypeNames.push(activityType);
+        // Add an activity type that exists
+        if ($scope.activityTypes[activityType]) {
+          $scope.caseType.definition.activityTypes.push({name: activityType});
+        } else {
+          createActivity(activityType, function(newActivity) {
+            $scope.caseType.definition.activityTypes.push({name: newActivity.name});
+          });
+        }
       }
     };
 
     $scope.addRole = function(roles, roleName) {
       var names = _.pluck($scope.caseType.definition.caseRoles, 'name');
       if (!_.contains(names, roleName)) {
-        roles.push({
-          name: roleName
-        });
-      }
-      if (!_.contains($scope.relationshipTypeNames, roleName)) {
-        $scope.relationshipTypeNames.push(roleName);
+        if (_.where($scope.relationshipTypeOptions, {id: roleName}).length) {
+          roles.push({name: roleName});
+        } else {
+          CRM.loadForm(CRM.url('civicrm/admin/reltype', {action: 'add', reset: 1, label_a_b: roleName, label_b_a: roleName}))
+            .on('crmFormSuccess', function(e, data) {
+              roles.push({name: data.relationshipType[REL_TYPE_CNAME]});
+              $scope.relationshipTypeOptions.push({id: data.relationshipType[REL_TYPE_CNAME], text: data.relationshipType.label_b_a});
+              $scope.$digest();
+            });
+        }
       }
     };
 
       return !$scope.caseType.id || $scope.caseType.is_forkable;
     };
 
+    $scope.newStatus = function() {
+      CRM.loadForm(CRM.url('civicrm/admin/options/case_status', {action: 'add', reset: 1}))
+        .on('crmFormSuccess', function(e, data) {
+          $scope.caseStatuses[data.optionValue.name] = data.optionValue;
+          $scope.selectedStatuses[data.optionValue.name] = true;
+          $scope.$digest();
+        });
+    };
+
     $scope.isNewActivitySetAllowed = function(workflow) {
       switch (workflow) {
         case 'timeline':
     };
 
     $scope.save = function() {
+      // Add selected statuses
+      var selectedStatuses = [];
+      _.each($scope.selectedStatuses, function(v, k) {
+        if (v) selectedStatuses.push(k);
+      });
+      // Ignore if ALL or NONE selected
+      $scope.caseType.definition.statuses = selectedStatuses.length == _.size($scope.selectedStatuses) ? [] : selectedStatuses;
       var result = crmApi('CaseType', 'create', $scope.caseType, true);
       result.then(function(data) {
         if (data.is_error === 0 || data.is_error == '0') {