c27ad8e57f792b434b48ef576ccb90f80a0c76a0
1 // crmResource: Given a templateUrl "~/mymodule/myfile.html", load the matching HTML.
2 // This implementation loads partials and strings in per-module batches.
3 // FIXME: handling of CRM.strings not well tested; may be racy
4 (function(angular
, $, _
) {
5 angular
.module('crmResource', []);
7 angular
.module('crmResource').factory('crmResource', function($q
, $http
) {
8 var modules
= {}; // moduleQueue[module] = 'loading'|Object;
9 var templates
= {}; // templates[url] = HTML;
11 function CrmResourceModule(name
) {
13 this.status
= 'new'; // loading|loaded|error
18 angular
.extend(CrmResourceModule
.prototype, {
19 createDeferred
: function createDeferred() {
20 var deferred
= $q
.defer();
21 switch (this.status
) {
24 this.deferreds
.push(deferred
);
27 deferred
.resolve(this.data
);
33 throw 'Unknown status: ' + this.status
;
35 return deferred
.promise
;
37 load
: function load() {
39 this.status
= 'loading';
40 var moduleUrl
= CRM
.url('civicrm/ajax/angular-modules', {modules
: module
.name
, l
: CRM
.config
.lcMessages
, r
: CRM
.angular
.cacheCode
});
42 .success(function httpSuccess(data
) {
43 if (data
[module
.name
]) {
44 module
.onSuccess(data
[module
.name
]);
50 .error(function httpError() {
54 onSuccess
: function onSuccess(data
) {
57 this.status
= 'loaded';
58 if (this.data
.partials
) {
59 angular
.extend(templates
, this.data
.partials
);
61 if (this.data
.strings
) {
62 CRM
.addStrings(this.data
.domain
, this.data
.strings
);
64 angular
.forEach(this.deferreds
, function(deferred
) {
65 deferred
.resolve(module
.data
);
67 delete this.deferreds
;
69 onError
: function onError() {
70 this.status
= 'error';
71 angular
.forEach(this.deferreds
, function(deferred
) {
74 delete this.deferreds
;
79 // @return Promise<ModuleData>
80 getModule
: function getModule(name
) {
82 modules
[name
] = new CrmResourceModule(name
);
85 return modules
[name
].createDeferred();
87 // @return string|Promise<string>
88 getUrl
: function getUrl(url
) {
90 return templates
[url
];
93 var parts
= url
.split('/');
94 var deferred
= $q
.defer();
95 this.getModule(parts
[1]).then(
100 headers: function(name
) {
101 var headers
= {'Content-type': 'text/html'};
102 return name
? headers
[name
] : headers
;
108 deferred
.reject({status
: 500}); // FIXME
112 deferred
.reject({status
: 500}); // FIXME
116 return deferred
.promise
;
121 angular
.module('crmResource').config(function($provide
) {
122 $provide
.decorator('$templateCache', function($delegate
, $http
, $q
, crmResource
) {
123 var origGet
= $delegate
.get;
125 $delegate
.get = function(url
) {
126 if (urlPat
.test(url
)) {
127 return crmResource
.getUrl(url
);
130 return origGet
.call(this, url
);
137 })(angular
, CRM
.$, CRM
._
);