From c99f1a0ab288dd99e24e0d1008cc628d1e8e6dcd Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 20 Nov 2014 20:53:54 -0800 Subject: [PATCH] crmApi - Use Angular's $q deferred; report errors correctly --- js/angular-crmCaseType.js | 22 ++++++++-------------- templates/CRM/Core/Page/Angular.tpl | 27 +++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/js/angular-crmCaseType.js b/js/angular-crmCaseType.js index c7cfd6570e..fd525718fd 100644 --- a/js/angular-crmCaseType.js +++ b/js/angular-crmCaseType.js @@ -311,11 +311,9 @@ $scope.toggleCaseType = function (caseType) { caseType.is_active = (caseType.is_active == '1') ? '0' : '1'; crmApi('CaseType', 'create', caseType, true) - .then(function (data) { - if (data.is_error) { - caseType.is_active = (caseType.is_active == '1') ? '0' : '1'; // revert - $scope.$digest(); - } + .catch(function (data) { + caseType.is_active = (caseType.is_active == '1') ? '0' : '1'; // revert + $scope.$digest(); }); }; $scope.deleteCaseType = function (caseType) { @@ -325,21 +323,17 @@ } }) .then(function (data) { - if (!data.is_error) { - delete caseTypes.values[caseType.id]; - $scope.$digest(); - } + delete caseTypes.values[caseType.id]; + $scope.$digest(); }); }; $scope.revertCaseType = function (caseType) { caseType.definition = 'null'; caseType.is_forked = '0'; crmApi('CaseType', 'create', caseType, true) - .then(function (data) { - if (data.is_error) { - caseType.is_forked = '1'; // restore - $scope.$digest(); - } + .catch(function (data) { + caseType.is_forked = '1'; // restore + $scope.$digest(); }); }; }); diff --git a/templates/CRM/Core/Page/Angular.tpl b/templates/CRM/Core/Page/Angular.tpl index eb7b4421ee..706a810d0c 100644 --- a/templates/CRM/Core/Page/Angular.tpl +++ b/templates/CRM/Core/Page/Angular.tpl @@ -13,14 +13,33 @@ }); } ]); - crmApp.factory('crmApi', function(){ + // crmApi is a function(entity,action,params,message) which is similar to CRM.api3, but + // it follows Angular conventions (e.g. it's an injectable service which returns a $q promise) + crmApp.factory('crmApi', function($q) { return function(entity, action, params, message) { - // JSON serialization in CRM.api3 is not aware of Angular metadata like $$hash + // JSON serialization in CRM.api3 is not aware of Angular metadata like $$hash, so use angular.toJson() + var deferred = $q.defer(); + var p; if (_.isObject(entity)) { - return CRM.api3(eval('('+angular.toJson(entity)+')'), message); + p = CRM.api3(eval('('+angular.toJson(entity)+')'), message); } else { - return CRM.api3(entity, action, eval('('+angular.toJson(params)+')'), message); + p = CRM.api3(entity, action, eval('('+angular.toJson(params)+')'), message); } + // CRM.api3 returns a promise, but the promise doesn't really represent errors as errors, so we + // convert them + p.then( + function(result) { + if (result.is_error) { + deferred.reject(result); + } else { + deferred.resolve(result); + } + }, + function(error) { + deferred.reject(error); + } + ); + return deferred.promise; }; }); })(angular, CRM._); -- 2.25.1