89 lines
2.5 KiB
JavaScript
89 lines
2.5 KiB
JavaScript
// 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<string>
|
|
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._);
|