X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=ang%2FcrmUtil.js;h=c48b2cbc54ea3e4510ebc8748d498769560ece45;hb=8550efbefa508769e930a29ba23d912927b2a1bc;hp=d480279068239cb384be3ad958fa48a798d7af24;hpb=d5e5f8438fe2777954f815731e1422c367624bea;p=civicrm-core.git diff --git a/ang/crmUtil.js b/ang/crmUtil.js index d480279068..c48b2cbc54 100644 --- a/ang/crmUtil.js +++ b/ang/crmUtil.js @@ -16,6 +16,11 @@ var deferred = $q.defer(); var p; var backend = crmApi.backend || CRM.api3; + if (params && params.body_html) { + // CRM-18474 - remove Unicode Character 'LINE SEPARATOR' (U+2028) + // and 'PARAGRAPH SEPARATOR' (U+2029) from the html if present. + params.body_html = params.body_html.replace(/([\u2028]|[\u2029])/g, '\n'); + } if (_.isObject(entity)) { // eval content is locally generated. /*jshint -W061 */ @@ -301,4 +306,44 @@ }; }); + // Run a given function. If it is already running, wait for it to finish before running again. + // If multiple requests are made before the first request finishes, all but the last will be ignored. + // This prevents overwhelming the server with redundant queries during e.g. an autocomplete search while the user types. + // Given function should return an angular promise. crmThrottle will deliver the contents when resolved. + angular.module('crmUtil').factory('crmThrottle', function($q) { + var pending = [], + executing = []; + return function(func) { + var deferred = $q.defer(); + + function checkResult(result, success) { + _.pull(executing, func); + if (_.includes(pending, func)) { + runNext(); + } else if (success) { + deferred.resolve(result); + } else { + deferred.reject(result); + } + } + + function runNext() { + executing.push(func); + _.pull(pending, func); + func().then(function(result) { + checkResult(result, true); + }, function(result) { + checkResult(result, false); + }); + } + + if (!_.includes(executing, func)) { + runNext(); + } else if (!_.includes(pending, func)) { + pending.push(func); + } + return deferred.promise; + }; + }); + })(angular, CRM.$, CRM._);