(function(angular, $, _) { angular.module('ng') .config(['$locationProvider', function($locationProvider) { $locationProvider.hashPrefix(''); }]); angular.module('crmResource', []); angular.module('crmResource').factory('crmResource', function($q, $http) { var deferreds = {}; // null|object; deferreds[url][idx] = Deferred; var notify = function notify() { var oldDfrds = deferreds; deferreds = null; angular.forEach(oldDfrds, function(dfrs, url) { if (CRM.angular.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: CRM.angular.templates[url] }); }); } else { angular.forEach(dfrs, function(dfr) { dfr.reject({status: 500}); // FIXME }); } }); }; var moduleUrl = CRM.angular.bundleUrl; $http.get(moduleUrl) .then(function httpSuccess(response) { CRM.angular.templates = CRM.angular.templates || {}; angular.forEach(response.data, function (module) { if (module.partials) { angular.extend(CRM.angular.templates, module.partials); } if (module.strings) { CRM.addStrings(module.domain, module.strings); } }); notify(); }, function httpError() { notify(); }); return { getUrl: function getUrl(url) { if (CRM.angular.templates && CRM.angular.templates[url]) { return CRM.angular.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._);