// crmResource: Given a templateUrl "~/mymodule/myfile.html", load the matching HTML. // This implementation loads all partials and strings in one batch. (function(angular, $, _) { angular.module('crmResource', []); angular.module('crmResource').factory('crmResource', function($q, $http) { var deferreds = {}; // null|object; deferreds[url][idx] = Deferred; var templates = null; // null|object; templates[url] = HTML; var notify = function notify() { var oldDfrds = deferreds; deferreds = null; angular.forEach(oldDfrds, function(dfrs, url) { if (templates[url]) { angular.forEach(dfrs, function(dfr) { dfr.resolve({ status: 200, headers: function(name) { var headers = {'Content-type': 'text/html'}; return name ? headers[name] : headers; }, data: templates[url] }); }); } else { angular.forEach(dfrs, function(dfr) { dfr.reject({status: 500}); // FIXME }); } }); }; var moduleUrl = CRM.angular.bundleUrl; $http.get(moduleUrl) .success(function httpSuccess(data) { templates = []; angular.forEach(data, function(module) { if (module.partials) { angular.extend(templates, module.partials); } if (module.strings) { CRM.addStrings(module.domain, module.strings); } }); notify(); }) .error(function httpError() { templates = []; notify(); }); return { // @return string|Promise getUrl: function getUrl(url) { if (templates !== null) { return templates[url]; } else { var deferred = $q.defer(); if (!deferreds[url]) { deferreds[url] = []; } deferreds[url].push(deferred); return deferred.promise; } } }; }); angular.module('crmResource').config(function($provide) { $provide.decorator('$templateCache', function($delegate, $http, $q, crmResource) { var origGet = $delegate.get; var urlPat = /^~\//; $delegate.get = function(url) { if (urlPat.test(url)) { return crmResource.getUrl(url); } else { return origGet.call(this, url); } }; return $delegate; }); }); })(angular, CRM.$, CRM._);