From 7c2b40d1fda18a8a845489b1853991d5af4b17be Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Fri, 20 Jan 2017 18:52:07 -0500 Subject: [PATCH] CRM-19778 - Configuration ui for case statuses per case-type --- CRM/Admin/Form/Options.php | 2 ++ CRM/Case/BAO/CaseType.php | 13 +++++++++ ang/crmCaseType.js | 35 ++++++++++++++++++++++--- ang/crmCaseType/activityTypesTable.html | 2 +- ang/crmCaseType/edit.html | 7 ++--- ang/crmCaseType/statusTable.html | 35 +++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 ang/crmCaseType/statusTable.html diff --git a/CRM/Admin/Form/Options.php b/CRM/Admin/Form/Options.php index 5752d341d1..670a21688a 100644 --- a/CRM/Admin/Form/Options.php +++ b/CRM/Admin/Form/Options.php @@ -488,6 +488,8 @@ class CRM_Admin_Form_Options extends CRM_Admin_Form { 1 => $this->_gLabel, 2 => $optionValue->label, )), ts('Saved'), 'success'); + + $this->ajaxResponse['optionValue'] = $optionValue->toArray(); } } diff --git a/CRM/Case/BAO/CaseType.php b/CRM/Case/BAO/CaseType.php index b06d7b3dc2..65a49863bf 100644 --- a/CRM/Case/BAO/CaseType.php +++ b/CRM/Case/BAO/CaseType.php @@ -130,6 +130,14 @@ class CRM_Case_BAO_CaseType extends CRM_Case_DAO_CaseType { $xmlFile .= "\n"; } + if (!empty($definition['statuses'])) { + $xmlFile .= "\n"; + foreach ($definition['statuses'] as $value) { + $xmlFile .= "$value\n"; + } + $xmlFile .= "\n"; + } + if (isset($definition['activitySets'])) { $xmlFile .= "\n"; foreach ($definition['activitySets'] as $k => $val) { @@ -224,6 +232,11 @@ class CRM_Case_BAO_CaseType extends CRM_Case_DAO_CaseType { } } + // set statuses + if (isset($xml->Statuses)) { + $definition['statuses'] = (array) $xml->Statuses->Status; + } + // set activity sets if (isset($xml->ActivitySets)) { $definition['activitySets'] = array(); diff --git a/ang/crmCaseType.js b/ang/crmCaseType.js index e5aae2a351..31f85c9b2f 100644 --- a/ang/crmCaseType.js +++ b/ang/crmCaseType.js @@ -50,7 +50,14 @@ 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', @@ -126,7 +133,8 @@ crmCaseType.controller('CaseTypeCtrl', function($scope, crmApi, apiCalls) { var ts = $scope.ts = CRM.ts(null); - $scope.activityStatuses = _.values(apiCalls.actStatuses.values); + $scope.activityStatuses = apiCalls.actStatuses.values; + $scope.caseStatuses = _.indexBy(apiCalls.caseStatuses.values, 'name'); $scope.activityTypes = apiCalls.actTypes.values; $scope.activityTypeNames = _.pluck(apiCalls.actTypes.values, 'name'); $scope.activityTypes = apiCalls.actTypes.values; @@ -143,7 +151,12 @@ $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 = {}; @@ -222,6 +235,15 @@ 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': @@ -274,6 +296,13 @@ }; $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') { diff --git a/ang/crmCaseType/activityTypesTable.html b/ang/crmCaseType/activityTypesTable.html index bceb0856db..966f975488 100644 --- a/ang/crmCaseType/activityTypesTable.html +++ b/ang/crmCaseType/activityTypesTable.html @@ -2,7 +2,7 @@ Controller: CaseTypeCtrl Required vars: caseType --> - +
diff --git a/ang/crmCaseType/edit.html b/ang/crmCaseType/edit.html index b73e01caf1..19bcae0d57 100644 --- a/ang/crmCaseType/edit.html +++ b/ang/crmCaseType/edit.html @@ -28,6 +28,7 @@ Required vars: caseType
-
-
-
+
+ +
diff --git a/ang/crmCaseType/statusTable.html b/ang/crmCaseType/statusTable.html new file mode 100644 index 0000000000..890989a3b0 --- /dev/null +++ b/ang/crmCaseType/statusTable.html @@ -0,0 +1,35 @@ + +
{{ts('Activity Type')}}
+ + + + + + + + + + + + + + + + + + + + + + + +
{{ts('Name')}}{{ts('Class')}}
+ + + {{ caseStatuses[status].label }} + + {{ caseStatuses[status].grouping }} +
{{ ts('New Status') }}
-- 2.25.1