@abp/jquery 5.0.0-rc.1 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- module.exports = {
2
- mappings: {
3
- "@node_modules/jquery/dist/jquery.js": "@libs/jquery/",
4
- "@node_modules/@abp/jquery/src/*.*": "@libs/abp/jquery/"
5
- }
1
+ module.exports = {
2
+ mappings: {
3
+ "@node_modules/jquery/dist/jquery.js": "@libs/jquery/",
4
+ "@node_modules/@abp/jquery/src/*.*": "@libs/abp/jquery/"
5
+ }
6
6
  }
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "5.0.0-rc.1",
2
+ "version": "5.0.2",
3
3
  "name": "@abp/jquery",
4
4
  "repository": {
5
5
  "type": "git",
@@ -10,7 +10,7 @@
10
10
  "access": "public"
11
11
  },
12
12
  "dependencies": {
13
- "@abp/core": "~5.0.0-rc.1",
13
+ "@abp/core": "~5.0.2",
14
14
  "jquery": "~3.6.0"
15
15
  },
16
16
  "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
package/src/abp.jquery.js CHANGED
@@ -1,404 +1,404 @@
1
- var abp = abp || {};
2
- (function($) {
3
-
4
- if (!$) {
5
- throw "abp/jquery library requires the jquery library included to the page!";
6
- }
7
-
8
- // ABP CORE OVERRIDES /////////////////////////////////////////////////////
9
-
10
- abp.message._showMessage = function (message, title) {
11
- alert((title || '') + ' ' + message);
12
-
13
- return $.Deferred(function ($dfd) {
14
- $dfd.resolve();
15
- });
16
- };
17
-
18
- abp.message.confirm = function (message, titleOrCallback, callback) {
19
- if (titleOrCallback && !(typeof titleOrCallback == 'string')) {
20
- callback = titleOrCallback;
21
- }
22
-
23
- var result = confirm(message);
24
- callback && callback(result);
25
-
26
- return $.Deferred(function ($dfd) {
27
- $dfd.resolve(result);
28
- });
29
- };
30
-
31
- abp.utils.isFunction = function (obj) {
32
- return $.isFunction(obj);
33
- };
34
-
35
- // JQUERY EXTENSIONS //////////////////////////////////////////////////////
36
-
37
- $.fn.findWithSelf = function (selector) {
38
- return this.filter(selector).add(this.find(selector));
39
- };
40
-
41
- // DOM ////////////////////////////////////////////////////////////////////
42
-
43
- abp.dom = abp.dom || {};
44
-
45
- abp.dom.onNodeAdded = function (callback) {
46
- abp.event.on('abp.dom.nodeAdded', callback);
47
- };
48
-
49
- abp.dom.onNodeRemoved = function (callback) {
50
- abp.event.on('abp.dom.nodeRemoved', callback);
51
- };
52
-
53
- var mutationObserverCallback = function (mutationsList) {
54
- for (var i = 0; i < mutationsList.length; i++) {
55
- var mutation = mutationsList[i];
56
- if (mutation.type === 'childList') {
57
- if (mutation.addedNodes && mutation.removedNodes.length) {
58
- for (var k = 0; k < mutation.removedNodes.length; k++) {
59
- abp.event.trigger(
60
- 'abp.dom.nodeRemoved',
61
- {
62
- $el: $(mutation.removedNodes[k])
63
- }
64
- );
65
- }
66
- }
67
-
68
- if (mutation.addedNodes && mutation.addedNodes.length) {
69
- for (var j = 0; j < mutation.addedNodes.length; j++) {
70
- abp.event.trigger(
71
- 'abp.dom.nodeAdded',
72
- {
73
- $el: $(mutation.addedNodes[j])
74
- }
75
- );
76
- }
77
- }
78
- }
79
- }
80
- };
81
-
82
- $(function(){
83
- new MutationObserver(mutationObserverCallback).observe(
84
- $('body')[0],
85
- {
86
- subtree: true,
87
- childList: true
88
- }
89
- );
90
- });
91
-
92
- // AJAX ///////////////////////////////////////////////////////////////////
93
-
94
- abp.ajax = function (userOptions) {
95
- userOptions = userOptions || {};
96
-
97
- var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
98
-
99
- options.success = undefined;
100
- options.error = undefined;
101
-
102
- var xhr = null;
103
- var promise = $.Deferred(function ($dfd) {
104
- xhr = $.ajax(options)
105
- .done(function (data, textStatus, jqXHR) {
106
- $dfd.resolve(data);
107
- userOptions.success && userOptions.success(data);
108
- }).fail(function (jqXHR) {
109
- if(jqXHR.statusText === 'abort') {
110
- //ajax request is abort, ignore error handle.
111
- return;
112
- }
113
- if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') {
114
- abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd);
115
- } else {
116
- abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
117
- }
118
- });
119
- }).promise();
120
-
121
- promise['jqXHR'] = xhr;
122
-
123
- return promise;
124
- };
125
-
126
- $.extend(abp.ajax, {
127
- defaultOpts: {
128
- dataType: 'json',
129
- type: 'POST',
130
- contentType: 'application/json',
131
- headers: {
132
- 'X-Requested-With': 'XMLHttpRequest'
133
- }
134
- },
135
-
136
- defaultError: {
137
- message: 'An error has occurred!',
138
- details: 'Error detail not sent by server.'
139
- },
140
-
141
- defaultError401: {
142
- message: 'You are not authenticated!',
143
- details: 'You should be authenticated (sign in) in order to perform this operation.'
144
- },
145
-
146
- defaultError403: {
147
- message: 'You are not authorized!',
148
- details: 'You are not allowed to perform this operation.'
149
- },
150
-
151
- defaultError404: {
152
- message: 'Resource not found!',
153
- details: 'The resource requested could not found on the server.'
154
- },
155
-
156
- logError: function (error) {
157
- abp.log.error(error);
158
- },
159
-
160
- showError: function (error) {
161
- if (error.details) {
162
- return abp.message.error(error.details, error.message);
163
- } else {
164
- return abp.message.error(error.message || abp.ajax.defaultError.message);
165
- }
166
- },
167
-
168
- handleTargetUrl: function (targetUrl) {
169
- if (!targetUrl) {
170
- location.href = abp.appPath;
171
- } else {
172
- location.href = targetUrl;
173
- }
174
- },
175
-
176
- handleErrorStatusCode: function (status) {
177
- switch (status) {
178
- case 401:
179
- abp.ajax.handleUnAuthorizedRequest(
180
- abp.ajax.showError(abp.ajax.defaultError401),
181
- abp.appPath
182
- );
183
- break;
184
- case 403:
185
- abp.ajax.showError(abp.ajax.defaultError403);
186
- break;
187
- case 404:
188
- abp.ajax.showError(abp.ajax.defaultError404);
189
- break;
190
- default:
191
- abp.ajax.showError(abp.ajax.defaultError);
192
- break;
193
- }
194
- },
195
-
196
- handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
197
- if (userOptions.abpHandleError !== false) {
198
- abp.ajax.handleErrorStatusCode(jqXHR.status);
199
- }
200
-
201
- $dfd.reject.apply(this, arguments);
202
- userOptions.error && userOptions.error.apply(this, arguments);
203
- },
204
-
205
- handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
206
- var messagePromise = null;
207
-
208
- if (userOptions.abpHandleError !== false) {
209
- messagePromise = abp.ajax.showError(jqXHR.responseJSON.error);
210
- }
211
-
212
- abp.ajax.logError(jqXHR.responseJSON.error);
213
-
214
- $dfd && $dfd.reject(jqXHR.responseJSON.error, jqXHR);
215
- userOptions.error && userOptions.error(jqXHR.responseJSON.error, jqXHR);
216
-
217
- if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
218
- abp.ajax.handleUnAuthorizedRequest(messagePromise);
219
- }
220
- },
221
-
222
- handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
223
- if (messagePromise) {
224
- messagePromise.done(function () {
225
- abp.ajax.handleTargetUrl(targetUrl);
226
- });
227
- } else {
228
- abp.ajax.handleTargetUrl(targetUrl);
229
- }
230
- },
231
-
232
- blockUI: function (options) {
233
- if (options.blockUI) {
234
- if (options.blockUI === true) { //block whole page
235
- abp.ui.setBusy();
236
- } else { //block an element
237
- abp.ui.setBusy(options.blockUI);
238
- }
239
- }
240
- },
241
-
242
- unblockUI: function (options) {
243
- if (options.blockUI) {
244
- if (options.blockUI === true) { //unblock whole page
245
- abp.ui.clearBusy();
246
- } else { //unblock an element
247
- abp.ui.clearBusy(options.blockUI);
248
- }
249
- }
250
- },
251
-
252
- ajaxSendHandler: function (event, request, settings) {
253
- var token = abp.security.antiForgery.getToken();
254
- if (!token) {
255
- return;
256
- }
257
-
258
- if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
259
- request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
260
- }
261
- }
262
- });
263
-
264
- $(document).ajaxSend(function (event, request, settings) {
265
- return abp.ajax.ajaxSendHandler(event, request, settings);
266
- });
267
-
268
- abp.event.on('abp.configurationInitialized', function () {
269
- var l = abp.localization.getResource('AbpUi');
270
-
271
- abp.ajax.defaultError.message = l('DefaultErrorMessage');
272
- abp.ajax.defaultError.details = l('DefaultErrorMessageDetail');
273
- abp.ajax.defaultError401.message = l('DefaultErrorMessage401');
274
- abp.ajax.defaultError401.details = l('DefaultErrorMessage401Detail');
275
- abp.ajax.defaultError403.message = l('DefaultErrorMessage403');
276
- abp.ajax.defaultError403.details = l('DefaultErrorMessage403Detail');
277
- abp.ajax.defaultError404.message = l('DefaultErrorMessage404');
278
- abp.ajax.defaultError404.details = l('DefaultErrorMessage404Detail');
279
- });
280
-
281
- // RESOURCE LOADER ////////////////////////////////////////////////////////
282
-
283
- /* UrlStates enum */
284
- var UrlStates = {
285
- LOADING: 'LOADING',
286
- LOADED: 'LOADED',
287
- FAILED: 'FAILED'
288
- };
289
-
290
- /* UrlInfo class */
291
- function UrlInfo(url) {
292
- this.url = url;
293
- this.state = UrlStates.LOADING;
294
- this.loadCallbacks = [];
295
- this.failCallbacks = [];
296
- }
297
-
298
- UrlInfo.prototype.succeed = function () {
299
- this.state = UrlStates.LOADED;
300
- for (var i = 0; i < this.loadCallbacks.length; i++) {
301
- this.loadCallbacks[i]();
302
- }
303
- };
304
-
305
- UrlInfo.prototype.failed = function () {
306
- this.state = UrlStates.FAILED;
307
- for (var i = 0; i < this.failCallbacks.length; i++) {
308
- this.failCallbacks[i]();
309
- }
310
- };
311
-
312
- UrlInfo.prototype.handleCallbacks = function (loadCallback, failCallback) {
313
- switch (this.state) {
314
- case UrlStates.LOADED:
315
- loadCallback && loadCallback();
316
- break;
317
- case UrlStates.FAILED:
318
- failCallback && failCallback();
319
- break;
320
- case UrlStates.LOADING:
321
- this.addCallbacks(loadCallback, failCallback);
322
- break;
323
- }
324
- };
325
-
326
- UrlInfo.prototype.addCallbacks = function (loadCallback, failCallback) {
327
- loadCallback && this.loadCallbacks.push(loadCallback);
328
- failCallback && this.failCallbacks.push(failCallback);
329
- };
330
-
331
- /* ResourceLoader API */
332
-
333
- abp.ResourceLoader = (function () {
334
-
335
- var _urlInfos = {};
336
-
337
- function getCacheKey(url) {
338
- return url;
339
- }
340
-
341
- function appendTimeToUrl(url) {
342
-
343
- if (url.indexOf('?') < 0) {
344
- url += '?';
345
- } else {
346
- url += '&';
347
- }
348
-
349
- url += '_=' + new Date().getTime();
350
-
351
- return url;
352
- }
353
-
354
- var _loadFromUrl = function (url, loadCallback, failCallback, serverLoader) {
355
-
356
- var cacheKey = getCacheKey(url);
357
-
358
- var urlInfo = _urlInfos[cacheKey];
359
-
360
- if (urlInfo) {
361
- urlInfo.handleCallbacks(loadCallback, failCallback);
362
- return;
363
- }
364
-
365
- _urlInfos[cacheKey] = urlInfo = new UrlInfo(url);
366
- urlInfo.addCallbacks(loadCallback, failCallback);
367
-
368
- serverLoader(urlInfo);
369
- };
370
-
371
- var _loadScript = function (url, loadCallback, failCallback) {
372
- _loadFromUrl(url, loadCallback, failCallback, function (urlInfo) {
373
- $.get({
374
- url: url,
375
- dataType: 'text'
376
- })
377
- .done(function (script) {
378
- $.globalEval(script);
379
- urlInfo.succeed();
380
- })
381
- .fail(function () {
382
- urlInfo.failed();
383
- });
384
- });
385
- };
386
-
387
- var _loadStyle = function (url) {
388
- _loadFromUrl(url, undefined, undefined, function (urlInfo) {
389
-
390
- $('<link/>', {
391
- rel: 'stylesheet',
392
- type: 'text/css',
393
- href: appendTimeToUrl(url)
394
- }).appendTo('head');
395
- });
396
- };
397
-
398
- return {
399
- loadScript: _loadScript,
400
- loadStyle: _loadStyle
401
- }
402
- })();
403
-
1
+ var abp = abp || {};
2
+ (function($) {
3
+
4
+ if (!$) {
5
+ throw "abp/jquery library requires the jquery library included to the page!";
6
+ }
7
+
8
+ // ABP CORE OVERRIDES /////////////////////////////////////////////////////
9
+
10
+ abp.message._showMessage = function (message, title) {
11
+ alert((title || '') + ' ' + message);
12
+
13
+ return $.Deferred(function ($dfd) {
14
+ $dfd.resolve();
15
+ });
16
+ };
17
+
18
+ abp.message.confirm = function (message, titleOrCallback, callback) {
19
+ if (titleOrCallback && !(typeof titleOrCallback == 'string')) {
20
+ callback = titleOrCallback;
21
+ }
22
+
23
+ var result = confirm(message);
24
+ callback && callback(result);
25
+
26
+ return $.Deferred(function ($dfd) {
27
+ $dfd.resolve(result);
28
+ });
29
+ };
30
+
31
+ abp.utils.isFunction = function (obj) {
32
+ return $.isFunction(obj);
33
+ };
34
+
35
+ // JQUERY EXTENSIONS //////////////////////////////////////////////////////
36
+
37
+ $.fn.findWithSelf = function (selector) {
38
+ return this.filter(selector).add(this.find(selector));
39
+ };
40
+
41
+ // DOM ////////////////////////////////////////////////////////////////////
42
+
43
+ abp.dom = abp.dom || {};
44
+
45
+ abp.dom.onNodeAdded = function (callback) {
46
+ abp.event.on('abp.dom.nodeAdded', callback);
47
+ };
48
+
49
+ abp.dom.onNodeRemoved = function (callback) {
50
+ abp.event.on('abp.dom.nodeRemoved', callback);
51
+ };
52
+
53
+ var mutationObserverCallback = function (mutationsList) {
54
+ for (var i = 0; i < mutationsList.length; i++) {
55
+ var mutation = mutationsList[i];
56
+ if (mutation.type === 'childList') {
57
+ if (mutation.addedNodes && mutation.removedNodes.length) {
58
+ for (var k = 0; k < mutation.removedNodes.length; k++) {
59
+ abp.event.trigger(
60
+ 'abp.dom.nodeRemoved',
61
+ {
62
+ $el: $(mutation.removedNodes[k])
63
+ }
64
+ );
65
+ }
66
+ }
67
+
68
+ if (mutation.addedNodes && mutation.addedNodes.length) {
69
+ for (var j = 0; j < mutation.addedNodes.length; j++) {
70
+ abp.event.trigger(
71
+ 'abp.dom.nodeAdded',
72
+ {
73
+ $el: $(mutation.addedNodes[j])
74
+ }
75
+ );
76
+ }
77
+ }
78
+ }
79
+ }
80
+ };
81
+
82
+ $(function(){
83
+ new MutationObserver(mutationObserverCallback).observe(
84
+ $('body')[0],
85
+ {
86
+ subtree: true,
87
+ childList: true
88
+ }
89
+ );
90
+ });
91
+
92
+ // AJAX ///////////////////////////////////////////////////////////////////
93
+
94
+ abp.ajax = function (userOptions) {
95
+ userOptions = userOptions || {};
96
+
97
+ var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
98
+
99
+ options.success = undefined;
100
+ options.error = undefined;
101
+
102
+ var xhr = null;
103
+ var promise = $.Deferred(function ($dfd) {
104
+ xhr = $.ajax(options)
105
+ .done(function (data, textStatus, jqXHR) {
106
+ $dfd.resolve(data);
107
+ userOptions.success && userOptions.success(data);
108
+ }).fail(function (jqXHR) {
109
+ if(jqXHR.statusText === 'abort') {
110
+ //ajax request is abort, ignore error handle.
111
+ return;
112
+ }
113
+ if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') {
114
+ abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd);
115
+ } else {
116
+ abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
117
+ }
118
+ });
119
+ }).promise();
120
+
121
+ promise['jqXHR'] = xhr;
122
+
123
+ return promise;
124
+ };
125
+
126
+ $.extend(abp.ajax, {
127
+ defaultOpts: {
128
+ dataType: 'json',
129
+ type: 'POST',
130
+ contentType: 'application/json',
131
+ headers: {
132
+ 'X-Requested-With': 'XMLHttpRequest'
133
+ }
134
+ },
135
+
136
+ defaultError: {
137
+ message: 'An error has occurred!',
138
+ details: 'Error detail not sent by server.'
139
+ },
140
+
141
+ defaultError401: {
142
+ message: 'You are not authenticated!',
143
+ details: 'You should be authenticated (sign in) in order to perform this operation.'
144
+ },
145
+
146
+ defaultError403: {
147
+ message: 'You are not authorized!',
148
+ details: 'You are not allowed to perform this operation.'
149
+ },
150
+
151
+ defaultError404: {
152
+ message: 'Resource not found!',
153
+ details: 'The resource requested could not found on the server.'
154
+ },
155
+
156
+ logError: function (error) {
157
+ abp.log.error(error);
158
+ },
159
+
160
+ showError: function (error) {
161
+ if (error.details) {
162
+ return abp.message.error(error.details, error.message);
163
+ } else {
164
+ return abp.message.error(error.message || abp.ajax.defaultError.message);
165
+ }
166
+ },
167
+
168
+ handleTargetUrl: function (targetUrl) {
169
+ if (!targetUrl) {
170
+ location.href = abp.appPath;
171
+ } else {
172
+ location.href = targetUrl;
173
+ }
174
+ },
175
+
176
+ handleErrorStatusCode: function (status) {
177
+ switch (status) {
178
+ case 401:
179
+ abp.ajax.handleUnAuthorizedRequest(
180
+ abp.ajax.showError(abp.ajax.defaultError401),
181
+ abp.appPath
182
+ );
183
+ break;
184
+ case 403:
185
+ abp.ajax.showError(abp.ajax.defaultError403);
186
+ break;
187
+ case 404:
188
+ abp.ajax.showError(abp.ajax.defaultError404);
189
+ break;
190
+ default:
191
+ abp.ajax.showError(abp.ajax.defaultError);
192
+ break;
193
+ }
194
+ },
195
+
196
+ handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
197
+ if (userOptions.abpHandleError !== false) {
198
+ abp.ajax.handleErrorStatusCode(jqXHR.status);
199
+ }
200
+
201
+ $dfd.reject.apply(this, arguments);
202
+ userOptions.error && userOptions.error.apply(this, arguments);
203
+ },
204
+
205
+ handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
206
+ var messagePromise = null;
207
+
208
+ if (userOptions.abpHandleError !== false) {
209
+ messagePromise = abp.ajax.showError(jqXHR.responseJSON.error);
210
+ }
211
+
212
+ abp.ajax.logError(jqXHR.responseJSON.error);
213
+
214
+ $dfd && $dfd.reject(jqXHR.responseJSON.error, jqXHR);
215
+ userOptions.error && userOptions.error(jqXHR.responseJSON.error, jqXHR);
216
+
217
+ if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
218
+ abp.ajax.handleUnAuthorizedRequest(messagePromise);
219
+ }
220
+ },
221
+
222
+ handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
223
+ if (messagePromise) {
224
+ messagePromise.done(function () {
225
+ abp.ajax.handleTargetUrl(targetUrl);
226
+ });
227
+ } else {
228
+ abp.ajax.handleTargetUrl(targetUrl);
229
+ }
230
+ },
231
+
232
+ blockUI: function (options) {
233
+ if (options.blockUI) {
234
+ if (options.blockUI === true) { //block whole page
235
+ abp.ui.setBusy();
236
+ } else { //block an element
237
+ abp.ui.setBusy(options.blockUI);
238
+ }
239
+ }
240
+ },
241
+
242
+ unblockUI: function (options) {
243
+ if (options.blockUI) {
244
+ if (options.blockUI === true) { //unblock whole page
245
+ abp.ui.clearBusy();
246
+ } else { //unblock an element
247
+ abp.ui.clearBusy(options.blockUI);
248
+ }
249
+ }
250
+ },
251
+
252
+ ajaxSendHandler: function (event, request, settings) {
253
+ var token = abp.security.antiForgery.getToken();
254
+ if (!token) {
255
+ return;
256
+ }
257
+
258
+ if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
259
+ request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
260
+ }
261
+ }
262
+ });
263
+
264
+ $(document).ajaxSend(function (event, request, settings) {
265
+ return abp.ajax.ajaxSendHandler(event, request, settings);
266
+ });
267
+
268
+ abp.event.on('abp.configurationInitialized', function () {
269
+ var l = abp.localization.getResource('AbpUi');
270
+
271
+ abp.ajax.defaultError.message = l('DefaultErrorMessage');
272
+ abp.ajax.defaultError.details = l('DefaultErrorMessageDetail');
273
+ abp.ajax.defaultError401.message = l('DefaultErrorMessage401');
274
+ abp.ajax.defaultError401.details = l('DefaultErrorMessage401Detail');
275
+ abp.ajax.defaultError403.message = l('DefaultErrorMessage403');
276
+ abp.ajax.defaultError403.details = l('DefaultErrorMessage403Detail');
277
+ abp.ajax.defaultError404.message = l('DefaultErrorMessage404');
278
+ abp.ajax.defaultError404.details = l('DefaultErrorMessage404Detail');
279
+ });
280
+
281
+ // RESOURCE LOADER ////////////////////////////////////////////////////////
282
+
283
+ /* UrlStates enum */
284
+ var UrlStates = {
285
+ LOADING: 'LOADING',
286
+ LOADED: 'LOADED',
287
+ FAILED: 'FAILED'
288
+ };
289
+
290
+ /* UrlInfo class */
291
+ function UrlInfo(url) {
292
+ this.url = url;
293
+ this.state = UrlStates.LOADING;
294
+ this.loadCallbacks = [];
295
+ this.failCallbacks = [];
296
+ }
297
+
298
+ UrlInfo.prototype.succeed = function () {
299
+ this.state = UrlStates.LOADED;
300
+ for (var i = 0; i < this.loadCallbacks.length; i++) {
301
+ this.loadCallbacks[i]();
302
+ }
303
+ };
304
+
305
+ UrlInfo.prototype.failed = function () {
306
+ this.state = UrlStates.FAILED;
307
+ for (var i = 0; i < this.failCallbacks.length; i++) {
308
+ this.failCallbacks[i]();
309
+ }
310
+ };
311
+
312
+ UrlInfo.prototype.handleCallbacks = function (loadCallback, failCallback) {
313
+ switch (this.state) {
314
+ case UrlStates.LOADED:
315
+ loadCallback && loadCallback();
316
+ break;
317
+ case UrlStates.FAILED:
318
+ failCallback && failCallback();
319
+ break;
320
+ case UrlStates.LOADING:
321
+ this.addCallbacks(loadCallback, failCallback);
322
+ break;
323
+ }
324
+ };
325
+
326
+ UrlInfo.prototype.addCallbacks = function (loadCallback, failCallback) {
327
+ loadCallback && this.loadCallbacks.push(loadCallback);
328
+ failCallback && this.failCallbacks.push(failCallback);
329
+ };
330
+
331
+ /* ResourceLoader API */
332
+
333
+ abp.ResourceLoader = (function () {
334
+
335
+ var _urlInfos = {};
336
+
337
+ function getCacheKey(url) {
338
+ return url;
339
+ }
340
+
341
+ function appendTimeToUrl(url) {
342
+
343
+ if (url.indexOf('?') < 0) {
344
+ url += '?';
345
+ } else {
346
+ url += '&';
347
+ }
348
+
349
+ url += '_=' + new Date().getTime();
350
+
351
+ return url;
352
+ }
353
+
354
+ var _loadFromUrl = function (url, loadCallback, failCallback, serverLoader) {
355
+
356
+ var cacheKey = getCacheKey(url);
357
+
358
+ var urlInfo = _urlInfos[cacheKey];
359
+
360
+ if (urlInfo) {
361
+ urlInfo.handleCallbacks(loadCallback, failCallback);
362
+ return;
363
+ }
364
+
365
+ _urlInfos[cacheKey] = urlInfo = new UrlInfo(url);
366
+ urlInfo.addCallbacks(loadCallback, failCallback);
367
+
368
+ serverLoader(urlInfo);
369
+ };
370
+
371
+ var _loadScript = function (url, loadCallback, failCallback) {
372
+ _loadFromUrl(url, loadCallback, failCallback, function (urlInfo) {
373
+ $.get({
374
+ url: url,
375
+ dataType: 'text'
376
+ })
377
+ .done(function (script) {
378
+ $.globalEval(script);
379
+ urlInfo.succeed();
380
+ })
381
+ .fail(function () {
382
+ urlInfo.failed();
383
+ });
384
+ });
385
+ };
386
+
387
+ var _loadStyle = function (url) {
388
+ _loadFromUrl(url, undefined, undefined, function (urlInfo) {
389
+
390
+ $('<link/>', {
391
+ rel: 'stylesheet',
392
+ type: 'text/css',
393
+ href: appendTimeToUrl(url)
394
+ }).appendTo('head');
395
+ });
396
+ };
397
+
398
+ return {
399
+ loadScript: _loadScript,
400
+ loadStyle: _loadStyle
401
+ }
402
+ })();
403
+
404
404
  })(jQuery);