sequential: 1,
is_active: 1,
options: {
- sort: CRM.crmCaseType.REL_TYPE_CNAME,
+ sort: 'label_a_b',
limit: 0
}
}];
});
crmCaseType.controller('CaseTypeCtrl', function($scope, crmApi, apiCalls, crmUiHelp) {
- var REL_TYPE_CNAME, defaultAssigneeDefaultValue, ts;
+ var defaultAssigneeDefaultValue, ts;
(function init () {
- // CRM_Case_XMLProcessor::REL_TYPE_CNAME
- REL_TYPE_CNAME = CRM.crmCaseType.REL_TYPE_CNAME;
ts = $scope.ts = CRM.ts(null);
$scope.hs = crmUiHelp({file: 'CRM/Case/CaseType'});
$scope.activityTypes = _.indexBy(apiCalls.actTypes.values, 'name');
$scope.activityTypeOptions = _.map(apiCalls.actTypes.values, formatActivityTypeOption);
$scope.defaultAssigneeTypes = apiCalls.defaultAssigneeTypes.values;
- $scope.relationshipTypeOptions = _.map(apiCalls.relTypes.values, function(type) {
- return {id: type[REL_TYPE_CNAME], text: type.label_b_a};
- });
- $scope.defaultRelationshipTypeOptions = getDefaultRelationshipTypeOptions();
+ $scope.relationshipTypeOptions = getRelationshipTypeOptions(false);
+ $scope.defaultRelationshipTypeOptions = getRelationshipTypeOptions(true);
// stores the default assignee values indexed by their option name:
$scope.defaultAssigneeTypeValues = _.chain($scope.defaultAssigneeTypes)
.indexBy('name').mapValues('value').value();
}
- /// Returns the default relationship type options. If the relationship is
- /// bidirectional (Ex: Spouse of) it adds a single option otherwise it adds
- /// two options representing the relationship type directions
- /// (Ex: Employee of, Employer is)
- function getDefaultRelationshipTypeOptions() {
+ // Returns the relationship type options. If the relationship is
+ // bidirectional (Ex: Spouse of) it adds a single option otherwise it adds
+ // two options representing the relationship type directions (Ex: Employee
+ // of, Employer of).
+ //
+ // The default relationship field needs values that are IDs with direction,
+ // while the role field needs values that are names (with implicit
+ // direction).
+ //
+ // At any rate, the labels should follow the convention in the UI of
+ // describing case roles from the perspective of the client, while the
+ // values must follow the convention in the XML of describing case roles
+ // from the perspective of the non-client.
+ function getRelationshipTypeOptions($isDefault) {
return _.transform(apiCalls.relTypes.values, function(result, relType) {
var isBidirectionalRelationship = relType.label_a_b === relType.label_b_a;
-
- result.push({
- label: relType.label_b_a,
- value: relType.id + '_b_a'
- });
-
- if (!isBidirectionalRelationship) {
+ if ($isDefault) {
result.push({
- label: relType.label_a_b,
+ label: relType.label_b_a,
value: relType.id + '_a_b'
});
+
+ if (!isBidirectionalRelationship) {
+ result.push({
+ label: relType.label_a_b,
+ value: relType.id + '_b_a'
+ });
+ }
+ }
+ // TODO The ids below really should use names not labels see
+ // https://lab.civicrm.org/dev/core/issues/774
+ else {
+ result.push({
+ text: relType.label_b_a,
+ id: relType.label_a_b
+ });
+
+ if (!isBidirectionalRelationship) {
+ result.push({
+ text: relType.label_a_b,
+ id: relType.label_b_a
+ });
+ }
}
}, []);
}
}
});
});
+
+ // go lookup and add client-perspective labels for $scope.caseType.definition.caseRoles
+ _.each($scope.caseType.definition.caseRoles, function (set) {
+ _.each($scope.relationshipTypeOptions, function (relTypes) {
+ if (relTypes.text == set.name) {
+ set.displaylabel = relTypes.id;
+ }
+ });
+ });
}
/// initializes the selected statuses
activity.default_assignee_contact = null;
};
+ // TODO roleName passed to addRole is a misnomer, its passed as the
+ // label HOWEVER it should be saved to xml as the name see
+ // https://lab.civicrm.org/dev/core/issues/774
+
/// Add a new role
$scope.addRole = function(roles, roleName) {
var names = _.pluck($scope.caseType.definition.caseRoles, 'name');
if (!_.contains(names, roleName)) {
- if (_.where($scope.relationshipTypeOptions, {id: roleName}).length) {
- roles.push({name: roleName});
+ var matchingRoles = _.filter($scope.relationshipTypeOptions, {id: roleName});
+ if (matchingRoles.length) {
+ var matchingRole = matchingRoles.shift();
+ roles.push({name: roleName, displaylabel: matchingRole.text});
} else {
- CRM.loadForm(CRM.url('civicrm/admin/reltype', {action: 'add', reset: 1, label_a_b: roleName, label_b_a: roleName}))
+ CRM.loadForm(CRM.url('civicrm/admin/reltype', {action: 'add', reset: 1, label_a_b: roleName}))
.on('crmFormSuccess', function(e, data) {
var newType = _.values(data.relationshipType)[0];
- roles.push({name: newType[REL_TYPE_CNAME]});
- $scope.relationshipTypeOptions.push({id: newType[REL_TYPE_CNAME], text: newType.label_b_a});
+ roles.push({name: newType.label_b_a, displaylabel: newType.label_a_b});
+ // Assume that the case role should be A-B but add both directions as options.
+ $scope.relationshipTypeOptions.push({id: newType.label_a_b, text: newType.label_a_b});
+ if (newType.label_a_b != newType.label_b_a) {
+ $scope.relationshipTypeOptions.push({id: newType.label_b_a, text: newType.label_b_a});
+ }
$scope.$digest();
});
}
$scope.caseType.definition.activityAsgmtGrps = $scope.caseType.definition.activityAsgmtGrps.toString().split(",");
}
+ function dropDisplaylabel (v) {
+ delete v.displaylabel;
+ }
+
+ // strip out labels from $scope.caseType.definition.caseRoles
+ _.map($scope.caseType.definition.caseRoles, dropDisplaylabel);
+
var result = crmApi('CaseType', 'create', $scope.caseType, true);
result.then(function(data) {
if (data.is_error === 0 || data.is_error == '0') {