voltar 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +37 -0
- data/app/assets/fonts/FontAwesome.otf +0 -0
- data/app/assets/fonts/Simple-Line-Icons.eot +0 -0
- data/app/assets/fonts/Simple-Line-Icons.svg +1369 -0
- data/app/assets/fonts/Simple-Line-Icons.ttf +0 -0
- data/app/assets/fonts/Simple-Line-Icons.woff +0 -0
- data/app/assets/fonts/fontawesome-webfont.eot +0 -0
- data/app/assets/fonts/fontawesome-webfont.svg +520 -0
- data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/app/assets/fonts/fontawesome-webfont.woff +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/app/assets/fonts/sourcesanspro/sourcesanspro-bold.woff +0 -0
- data/app/assets/fonts/sourcesanspro/sourcesanspro-light.woff +0 -0
- data/app/assets/fonts/sourcesanspro/sourcesanspro.woff +0 -0
- data/app/assets/javascripts/voltar/app.js +203 -0
- data/app/assets/javascripts/voltar/application.js +33 -0
- data/app/assets/javascripts/voltar/controllers/app_ctrl.js.erb +673 -0
- data/app/assets/javascripts/voltar/directives/app_directives.js +345 -0
- data/app/assets/javascripts/voltar/factories/app_services.js +255 -0
- data/app/assets/javascripts/voltar/stripe.js.coffee +2 -0
- data/app/assets/stylesheets/voltar/app.css +4990 -0
- data/app/assets/stylesheets/voltar/application.css +23 -0
- data/app/assets/stylesheets/voltar/voltar.css.scss +93 -0
- data/app/controllers/voltar/application_controller.rb +4 -0
- data/app/controllers/voltar/dashboard_controller.rb +11 -0
- data/app/helpers/voltar/application_helper.rb +4 -0
- data/app/views/layouts/voltar/application.html.erb +40 -0
- data/app/views/voltar/account/_billing.html.erb +552 -0
- data/app/views/voltar/account/_locations.html.erb +135 -0
- data/app/views/voltar/account/_managers.html +134 -0
- data/app/views/voltar/account/_password.html.erb +57 -0
- data/app/views/voltar/account/_profile.html.erb +84 -0
- data/app/views/voltar/dashboard/index.html.erb +0 -0
- data/app/views/voltar/inventory/_delete_dialog.html.erb +16 -0
- data/app/views/voltar/inventory/_edit.html.erb +244 -0
- data/app/views/voltar/inventory/_index.html.erb +160 -0
- data/app/views/voltar/inventory/_mark_as_sold_dialog.html.erb +26 -0
- data/app/views/voltar/shared/_keen_js.html.haml +11 -0
- data/app/views/voltar/shared/_voltar_app.html.erb +83 -0
- data/app/views/voltar/shared/_voltar_aside.html.erb +71 -0
- data/app/views/voltar/shared/_voltar_footer.html.erb +13 -0
- data/app/views/voltar/shared/_voltar_header.html.erb +156 -0
- data/app/views/voltar/shared/app/_country_province_select.html +19 -0
- data/app/views/voltar/shared/app/_dashboard.html.erb +243 -0
- data/app/views/voltar/shared/app/_notifications.html.erb +13 -0
- data/app/views/voltar/shared/app/_spinner.html.erb +8 -0
- data/config/routes.rb +4 -0
- data/lib/tasks/voltar_tasks.rake +4 -0
- data/lib/voltar.rb +5 -0
- data/lib/voltar/engine.rb +15 -0
- data/lib/voltar/version.rb +3 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +76 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/log/development.log +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/voltar_test.rb +7 -0
- data/vendor/assets/images/voltar/a0.jpg +0 -0
- data/vendor/assets/images/voltar/a1.jpg +0 -0
- data/vendor/assets/images/voltar/a10.jpg +0 -0
- data/vendor/assets/images/voltar/a2.jpg +0 -0
- data/vendor/assets/images/voltar/a3.jpg +0 -0
- data/vendor/assets/images/voltar/a4.jpg +0 -0
- data/vendor/assets/images/voltar/a5.jpg +0 -0
- data/vendor/assets/images/voltar/a6.jpg +0 -0
- data/vendor/assets/images/voltar/a7.jpg +0 -0
- data/vendor/assets/images/voltar/a8.jpg +0 -0
- data/vendor/assets/images/voltar/a9.jpg +0 -0
- data/vendor/assets/images/voltar/b0.jpg +0 -0
- data/vendor/assets/images/voltar/b1.jpg +0 -0
- data/vendor/assets/images/voltar/b2.jpg +0 -0
- data/vendor/assets/images/voltar/b3.jpg +0 -0
- data/vendor/assets/images/voltar/b4.jpg +0 -0
- data/vendor/assets/images/voltar/b5.jpg +0 -0
- data/vendor/assets/images/voltar/c0.jpg +0 -0
- data/vendor/assets/images/voltar/c1.jpg +0 -0
- data/vendor/assets/images/voltar/c2.jpg +0 -0
- data/vendor/assets/images/voltar/c3.jpg +0 -0
- data/vendor/assets/images/voltar/c4.jpg +0 -0
- data/vendor/assets/images/voltar/c5.jpg +0 -0
- data/vendor/assets/images/voltar/chosen-sprite.png +0 -0
- data/vendor/assets/images/voltar/chosen-sprite@2x.png +0 -0
- data/vendor/assets/images/voltar/logo.png +0 -0
- data/vendor/assets/images/voltar/p0.jpg +0 -0
- data/vendor/assets/javascripts/voltar/angular-animate.js +1689 -0
- data/vendor/assets/javascripts/voltar/angular-contenteditable.js +98 -0
- data/vendor/assets/javascripts/voltar/angular-cookies.js +206 -0
- data/vendor/assets/javascripts/voltar/angular-sanitize.js +647 -0
- data/vendor/assets/javascripts/voltar/angular-ui-router.js +3658 -0
- data/vendor/assets/javascripts/voltar/angular.js +22024 -0
- data/vendor/assets/javascripts/voltar/chosen.jquery.min.js +2 -0
- data/vendor/assets/javascripts/voltar/easypiechart/jquery.easy-pie-chart.js +209 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.min.js +29 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.orderBars.js +187 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.pie.min.js +56 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.resize.js +60 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.spline.js +212 -0
- data/vendor/assets/javascripts/voltar/flot/jquery.flot.tooltip.min.js +12 -0
- data/vendor/assets/javascripts/voltar/jquery.min.js +5 -0
- data/vendor/assets/javascripts/voltar/moment.js +2856 -0
- data/vendor/assets/javascripts/voltar/ngStorage.js +103 -0
- data/vendor/assets/javascripts/voltar/ocLazyLoad.js +906 -0
- data/vendor/assets/javascripts/voltar/smart-table.min.js +1 -0
- data/vendor/assets/javascripts/voltar/sparkline/jquery.sparkline.min.js +2 -0
- data/vendor/assets/javascripts/voltar/toaster.js +185 -0
- data/vendor/assets/javascripts/voltar/ui-bootstrap-tpls.js +4116 -0
- data/vendor/assets/javascripts/voltar/ui-jq.js +86 -0
- data/vendor/assets/javascripts/voltar/ui-load.js +93 -0
- data/vendor/assets/javascripts/voltar/ui-validate.js +119 -0
- data/vendor/assets/stylesheets/voltar/animate.css +1098 -0
- data/vendor/assets/stylesheets/voltar/bootstrap.css +6202 -0
- data/vendor/assets/stylesheets/voltar/chosen.css +399 -0
- data/vendor/assets/stylesheets/voltar/font-awesome.min.css +4 -0
- data/vendor/assets/stylesheets/voltar/font.css +18 -0
- data/vendor/assets/stylesheets/voltar/simple-line-icons.css +526 -0
- data/vendor/assets/stylesheets/voltar/toaster.css +213 -0
- metadata +333 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
(function() {
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @ngdoc overview
|
7
|
+
* @name ngStorage
|
8
|
+
*/
|
9
|
+
|
10
|
+
angular.module('ngStorage', []).
|
11
|
+
|
12
|
+
/**
|
13
|
+
* @ngdoc object
|
14
|
+
* @name ngStorage.$localStorage
|
15
|
+
* @requires $rootScope
|
16
|
+
* @requires $window
|
17
|
+
*/
|
18
|
+
|
19
|
+
factory('$localStorage', _storageFactory('localStorage')).
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @ngdoc object
|
23
|
+
* @name ngStorage.$sessionStorage
|
24
|
+
* @requires $rootScope
|
25
|
+
* @requires $window
|
26
|
+
*/
|
27
|
+
|
28
|
+
factory('$sessionStorage', _storageFactory('sessionStorage'));
|
29
|
+
|
30
|
+
function _storageFactory(storageType) {
|
31
|
+
return [
|
32
|
+
'$rootScope',
|
33
|
+
'$window',
|
34
|
+
|
35
|
+
function(
|
36
|
+
$rootScope,
|
37
|
+
$window
|
38
|
+
){
|
39
|
+
// #9: Assign a placeholder object if Web Storage is unavailable to prevent breaking the entire AngularJS app
|
40
|
+
var webStorage = $window[storageType] || (console.warn('This browser does not support Web Storage!'), {}),
|
41
|
+
$storage = {
|
42
|
+
$default: function(items) {
|
43
|
+
for (var k in items) {
|
44
|
+
angular.isDefined($storage[k]) || ($storage[k] = items[k]);
|
45
|
+
}
|
46
|
+
|
47
|
+
return $storage;
|
48
|
+
},
|
49
|
+
$reset: function(items) {
|
50
|
+
for (var k in $storage) {
|
51
|
+
'$' === k[0] || delete $storage[k];
|
52
|
+
}
|
53
|
+
|
54
|
+
return $storage.$default(items);
|
55
|
+
}
|
56
|
+
},
|
57
|
+
_last$storage,
|
58
|
+
_debounce;
|
59
|
+
|
60
|
+
for (var i = 0, k; i < webStorage.length; i++) {
|
61
|
+
// #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
|
62
|
+
(k = webStorage.key(i)) && 'ngStorage-' === k.slice(0, 10) && ($storage[k.slice(10)] = angular.fromJson(webStorage.getItem(k)));
|
63
|
+
}
|
64
|
+
|
65
|
+
_last$storage = angular.copy($storage);
|
66
|
+
|
67
|
+
$rootScope.$watch(function() {
|
68
|
+
_debounce || (_debounce = setTimeout(function() {
|
69
|
+
_debounce = null;
|
70
|
+
|
71
|
+
if (!angular.equals($storage, _last$storage)) {
|
72
|
+
angular.forEach($storage, function(v, k) {
|
73
|
+
angular.isDefined(v) && '$' !== k[0] && webStorage.setItem('ngStorage-' + k, angular.toJson(v));
|
74
|
+
|
75
|
+
delete _last$storage[k];
|
76
|
+
});
|
77
|
+
|
78
|
+
for (var k in _last$storage) {
|
79
|
+
webStorage.removeItem('ngStorage-' + k);
|
80
|
+
}
|
81
|
+
|
82
|
+
_last$storage = angular.copy($storage);
|
83
|
+
}
|
84
|
+
}, 100));
|
85
|
+
});
|
86
|
+
|
87
|
+
// #6: Use `$window.addEventListener` instead of `angular.element` to avoid the jQuery-specific `event.originalEvent`
|
88
|
+
'localStorage' === storageType && $window.addEventListener && $window.addEventListener('storage', function(event) {
|
89
|
+
if ('ngStorage-' === event.key.slice(0, 10)) {
|
90
|
+
event.newValue ? $storage[event.key.slice(10)] = angular.fromJson(event.newValue) : delete $storage[event.key.slice(10)];
|
91
|
+
|
92
|
+
_last$storage = angular.copy($storage);
|
93
|
+
|
94
|
+
$rootScope.$apply();
|
95
|
+
}
|
96
|
+
});
|
97
|
+
|
98
|
+
return $storage;
|
99
|
+
}
|
100
|
+
];
|
101
|
+
}
|
102
|
+
|
103
|
+
})();
|
@@ -0,0 +1,906 @@
|
|
1
|
+
/**
|
2
|
+
* oclazyload - Load modules on demand (lazy load) with angularJS
|
3
|
+
* @version v0.3.7
|
4
|
+
* @link https://github.com/ocombe/ocLazyLoad
|
5
|
+
* @license MIT
|
6
|
+
* @author Olivier Combe <olivier.combe@gmail.com>
|
7
|
+
*/
|
8
|
+
(function() {
|
9
|
+
'use strict';
|
10
|
+
var regModules = ['ng'],
|
11
|
+
regInvokes = [],
|
12
|
+
regConfigs = [],
|
13
|
+
justLoaded = [],
|
14
|
+
ocLazyLoad = angular.module('oc.lazyLoad', ['ng']),
|
15
|
+
broadcast = angular.noop;
|
16
|
+
|
17
|
+
ocLazyLoad.provider('$ocLazyLoad', ['$controllerProvider', '$provide', '$compileProvider', '$filterProvider', '$injector', '$animateProvider',
|
18
|
+
function($controllerProvider, $provide, $compileProvider, $filterProvider, $injector, $animateProvider) {
|
19
|
+
var modules = {},
|
20
|
+
providers = {
|
21
|
+
$controllerProvider: $controllerProvider,
|
22
|
+
$compileProvider: $compileProvider,
|
23
|
+
$filterProvider: $filterProvider,
|
24
|
+
$provide: $provide, // other things
|
25
|
+
$injector: $injector,
|
26
|
+
$animateProvider: $animateProvider
|
27
|
+
},
|
28
|
+
anchor = document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0],
|
29
|
+
jsLoader, cssLoader, templatesLoader,
|
30
|
+
debug = false,
|
31
|
+
events = false;
|
32
|
+
|
33
|
+
// Let's get the list of loaded modules & components
|
34
|
+
init(angular.element(window.document));
|
35
|
+
|
36
|
+
this.$get = ['$timeout', '$log', '$q', '$templateCache', '$http', '$rootElement', '$rootScope', '$cacheFactory', function($timeout, $log, $q, $templateCache, $http, $rootElement, $rootScope, $cacheFactory) {
|
37
|
+
var instanceInjector,
|
38
|
+
filesCache = $cacheFactory('ocLazyLoad');
|
39
|
+
|
40
|
+
if(!debug) {
|
41
|
+
$log = {};
|
42
|
+
$log['error'] = angular.noop;
|
43
|
+
$log['warn'] = angular.noop;
|
44
|
+
$log['info'] = angular.noop;
|
45
|
+
}
|
46
|
+
|
47
|
+
// Make this lazy because at the moment that $get() is called the instance injector hasn't been assigned to the rootElement yet
|
48
|
+
providers.getInstanceInjector = function() {
|
49
|
+
return (instanceInjector) ? instanceInjector : (instanceInjector = $rootElement.data('$injector'));
|
50
|
+
};
|
51
|
+
|
52
|
+
broadcast = function broadcast(eventName, params) {
|
53
|
+
if(events) {
|
54
|
+
$rootScope.$broadcast(eventName, params);
|
55
|
+
}
|
56
|
+
if(debug) {
|
57
|
+
$log.info(eventName, params);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Load a js/css file
|
63
|
+
* @param type
|
64
|
+
* @param path
|
65
|
+
* @returns promise
|
66
|
+
*/
|
67
|
+
var buildElement = function buildElement(type, path, params) {
|
68
|
+
var deferred = $q.defer(),
|
69
|
+
el, loaded,
|
70
|
+
cacheBuster = function cacheBuster(url) {
|
71
|
+
var dc = new Date().getTime();
|
72
|
+
if(url.indexOf('?') >= 0) {
|
73
|
+
if(url.substring(0, url.length - 1) === '&') {
|
74
|
+
return url + '_dc=' + dc;
|
75
|
+
}
|
76
|
+
return url + '&_dc=' + dc;
|
77
|
+
} else {
|
78
|
+
return url + '?_dc=' + dc;
|
79
|
+
}
|
80
|
+
};
|
81
|
+
|
82
|
+
// Store the promise early so the file load can be detected by other parallel lazy loads
|
83
|
+
// (ie: multiple routes on one page) a 'true' value isn't sufficient
|
84
|
+
// as it causes false positive load results.
|
85
|
+
if(angular.isUndefined(filesCache.get(path))) {
|
86
|
+
filesCache.put(path, deferred.promise);
|
87
|
+
}
|
88
|
+
|
89
|
+
// Switch in case more content types are added later
|
90
|
+
switch(type) {
|
91
|
+
case 'css':
|
92
|
+
el = document.createElement('link');
|
93
|
+
el.type = 'text/css';
|
94
|
+
el.rel = 'stylesheet';
|
95
|
+
el.href = params.cache === false ? cacheBuster(path) : path;
|
96
|
+
break;
|
97
|
+
case 'js':
|
98
|
+
el = document.createElement('script');
|
99
|
+
el.src = params.cache === false ? cacheBuster(path) : path;
|
100
|
+
break;
|
101
|
+
default:
|
102
|
+
deferred.reject(new Error('Requested type "' + type + '" is not known. Could not inject "' + path + '"'));
|
103
|
+
break;
|
104
|
+
}
|
105
|
+
el.onload = el['onreadystatechange'] = function(e) {
|
106
|
+
if((el['readyState'] && !(/^c|loade/.test(el['readyState']))) || loaded) return;
|
107
|
+
el.onload = el['onreadystatechange'] = null
|
108
|
+
loaded = 1;
|
109
|
+
broadcast('ocLazyLoad.fileLoaded', path);
|
110
|
+
deferred.resolve();
|
111
|
+
}
|
112
|
+
el.onerror = function(e) {
|
113
|
+
deferred.reject(new Error('Unable to load '+path));
|
114
|
+
}
|
115
|
+
el.async = 1;
|
116
|
+
anchor.insertBefore(el, anchor.lastChild);
|
117
|
+
|
118
|
+
return deferred.promise;
|
119
|
+
}
|
120
|
+
|
121
|
+
if(angular.isUndefined(jsLoader)) {
|
122
|
+
/**
|
123
|
+
* jsLoader function
|
124
|
+
* @type Function
|
125
|
+
* @param paths array list of js files to load
|
126
|
+
* @param callback to call when everything is loaded. We use a callback and not a promise
|
127
|
+
* @param params object config parameters
|
128
|
+
* because the user can overwrite jsLoader and it will probably not use promises :(
|
129
|
+
*/
|
130
|
+
jsLoader = function(paths, callback, params) {
|
131
|
+
var promises = [];
|
132
|
+
angular.forEach(paths, function loading(path) {
|
133
|
+
promises.push(buildElement('js', path, params));
|
134
|
+
});
|
135
|
+
$q.all(promises).then(function success() {
|
136
|
+
callback();
|
137
|
+
}, function error(err) {
|
138
|
+
callback(err);
|
139
|
+
});
|
140
|
+
}
|
141
|
+
jsLoader.ocLazyLoadLoader = true;
|
142
|
+
}
|
143
|
+
|
144
|
+
if(angular.isUndefined(cssLoader)) {
|
145
|
+
/**
|
146
|
+
* cssLoader function
|
147
|
+
* @type Function
|
148
|
+
* @param paths array list of css files to load
|
149
|
+
* @param callback to call when everything is loaded. We use a callback and not a promise
|
150
|
+
* @param params object config parameters
|
151
|
+
* because the user can overwrite cssLoader and it will probably not use promises :(
|
152
|
+
*/
|
153
|
+
cssLoader = function(paths, callback, params) {
|
154
|
+
var promises = [];
|
155
|
+
angular.forEach(paths, function loading(path) {
|
156
|
+
promises.push(buildElement('css', path, params));
|
157
|
+
});
|
158
|
+
$q.all(promises).then(function success() {
|
159
|
+
callback();
|
160
|
+
}, function error(err) {
|
161
|
+
callback(err);
|
162
|
+
});
|
163
|
+
}
|
164
|
+
cssLoader.ocLazyLoadLoader = true;
|
165
|
+
}
|
166
|
+
|
167
|
+
if(angular.isUndefined(templatesLoader)) {
|
168
|
+
/**
|
169
|
+
* templatesLoader function
|
170
|
+
* @type Function
|
171
|
+
* @param paths array list of css files to load
|
172
|
+
* @param callback to call when everything is loaded. We use a callback and not a promise
|
173
|
+
* @param params object config parameters for $http
|
174
|
+
* because the user can overwrite templatesLoader and it will probably not use promises :(
|
175
|
+
*/
|
176
|
+
templatesLoader = function(paths, callback, params) {
|
177
|
+
if(angular.isString(paths)) {
|
178
|
+
paths = [paths];
|
179
|
+
}
|
180
|
+
var promises = [];
|
181
|
+
angular.forEach(paths, function(url) {
|
182
|
+
var deferred = $q.defer();
|
183
|
+
promises.push(deferred.promise);
|
184
|
+
$http.get(url, params).success(function(data) {
|
185
|
+
angular.forEach(angular.element(data), function(node) {
|
186
|
+
if(node.nodeName === 'SCRIPT' && node.type === 'text/ng-template') {
|
187
|
+
$templateCache.put(node.id, node.innerHTML);
|
188
|
+
}
|
189
|
+
});
|
190
|
+
if(angular.isUndefined(filesCache.get(url))) {
|
191
|
+
filesCache.put(url, true);
|
192
|
+
}
|
193
|
+
deferred.resolve();
|
194
|
+
}).error(function(data) {
|
195
|
+
var err = 'Error load template "' + url + '": ' + data;
|
196
|
+
$log.error(err);
|
197
|
+
deferred.reject(new Error(err));
|
198
|
+
});
|
199
|
+
});
|
200
|
+
return $q.all(promises).then(function success() {
|
201
|
+
callback();
|
202
|
+
}, function error(err) {
|
203
|
+
callback(err);
|
204
|
+
});
|
205
|
+
}
|
206
|
+
templatesLoader.ocLazyLoadLoader = true;
|
207
|
+
}
|
208
|
+
|
209
|
+
var filesLoader = function(config, params) {
|
210
|
+
var cssFiles = [],
|
211
|
+
templatesFiles = [],
|
212
|
+
jsFiles = [],
|
213
|
+
promises = [],
|
214
|
+
cachePromise = null;
|
215
|
+
|
216
|
+
angular.extend(params || {}, config);
|
217
|
+
|
218
|
+
angular.forEach(params.files, function(path) {
|
219
|
+
cachePromise = filesCache.get(path);
|
220
|
+
if(angular.isUndefined(cachePromise) || params.cache === false) {
|
221
|
+
if(/\.css[^\.]*$/.test(path) && cssFiles.indexOf(path) === -1) {
|
222
|
+
cssFiles.push(path);
|
223
|
+
} else if(/\.(htm|html)[^\.]*$/.test(path) && templatesFiles.indexOf(path) === -1) {
|
224
|
+
templatesFiles.push(path);
|
225
|
+
} else if (jsFiles.indexOf(path) === -1) {
|
226
|
+
jsFiles.push(path);
|
227
|
+
}
|
228
|
+
} else if (cachePromise) {
|
229
|
+
promises.push(cachePromise);
|
230
|
+
}
|
231
|
+
});
|
232
|
+
|
233
|
+
if(cssFiles.length > 0) {
|
234
|
+
var cssDeferred = $q.defer();
|
235
|
+
cssLoader(cssFiles, function(err) {
|
236
|
+
if(angular.isDefined(err) && cssLoader.hasOwnProperty('ocLazyLoadLoader')) {
|
237
|
+
$log.error(err);
|
238
|
+
cssDeferred.reject(err);
|
239
|
+
} else {
|
240
|
+
cssDeferred.resolve();
|
241
|
+
}
|
242
|
+
}, params);
|
243
|
+
promises.push(cssDeferred.promise);
|
244
|
+
}
|
245
|
+
|
246
|
+
if(templatesFiles.length > 0) {
|
247
|
+
var templatesDeferred = $q.defer();
|
248
|
+
templatesLoader(templatesFiles, function(err) {
|
249
|
+
if(angular.isDefined(err) && templatesLoader.hasOwnProperty('ocLazyLoadLoader')) {
|
250
|
+
$log.error(err);
|
251
|
+
templatesDeferred.reject(err);
|
252
|
+
} else {
|
253
|
+
templatesDeferred.resolve();
|
254
|
+
}
|
255
|
+
}, params);
|
256
|
+
promises.push(templatesDeferred.promise);
|
257
|
+
}
|
258
|
+
|
259
|
+
if(jsFiles.length > 0) {
|
260
|
+
var jsDeferred = $q.defer();
|
261
|
+
jsLoader(jsFiles, function(err) {
|
262
|
+
if(angular.isDefined(err) && jsLoader.hasOwnProperty('ocLazyLoadLoader')) {
|
263
|
+
$log.error(err);
|
264
|
+
jsDeferred.reject(err);
|
265
|
+
} else {
|
266
|
+
jsDeferred.resolve();
|
267
|
+
}
|
268
|
+
}, params);
|
269
|
+
promises.push(jsDeferred.promise);
|
270
|
+
}
|
271
|
+
|
272
|
+
return $q.all(promises);
|
273
|
+
}
|
274
|
+
|
275
|
+
return {
|
276
|
+
getModuleConfig: function(name) {
|
277
|
+
if(!modules[name]) {
|
278
|
+
return null;
|
279
|
+
}
|
280
|
+
return modules[name];
|
281
|
+
},
|
282
|
+
|
283
|
+
setModuleConfig: function(module) {
|
284
|
+
modules[module.name] = module;
|
285
|
+
return module;
|
286
|
+
},
|
287
|
+
|
288
|
+
getModules: function() {
|
289
|
+
return regModules;
|
290
|
+
},
|
291
|
+
|
292
|
+
// deprecated
|
293
|
+
loadTemplateFile: function(paths, params) {
|
294
|
+
return filesLoader({files: paths}, params);
|
295
|
+
},
|
296
|
+
|
297
|
+
load: function(module, params) {
|
298
|
+
var self = this,
|
299
|
+
config = null,
|
300
|
+
moduleCache = [],
|
301
|
+
deferredList = [],
|
302
|
+
deferred = $q.defer(),
|
303
|
+
moduleName,
|
304
|
+
errText;
|
305
|
+
|
306
|
+
if(angular.isUndefined(params)) {
|
307
|
+
params = {};
|
308
|
+
}
|
309
|
+
|
310
|
+
// If module is an array, break it down
|
311
|
+
if(angular.isArray(module)) {
|
312
|
+
// Resubmit each entry as a single module
|
313
|
+
angular.forEach(module, function(m) {
|
314
|
+
if (m) {
|
315
|
+
deferredList.push(self.load(m, params));
|
316
|
+
}
|
317
|
+
});
|
318
|
+
|
319
|
+
// Resolve the promise once everything has loaded
|
320
|
+
$q.all(deferredList).then(function() {
|
321
|
+
deferred.resolve(module);
|
322
|
+
});
|
323
|
+
|
324
|
+
return deferred.promise;
|
325
|
+
}
|
326
|
+
|
327
|
+
moduleName = getModuleName(module);
|
328
|
+
|
329
|
+
// Get or Set a configuration depending on what was passed in
|
330
|
+
if(typeof module === 'string') {
|
331
|
+
config = self.getModuleConfig(module);
|
332
|
+
if(!config) {
|
333
|
+
config = {
|
334
|
+
files: [module]
|
335
|
+
};
|
336
|
+
moduleName = null;
|
337
|
+
}
|
338
|
+
} else if(typeof module === 'object') {
|
339
|
+
config = self.setModuleConfig(module);
|
340
|
+
}
|
341
|
+
|
342
|
+
if(config === null) {
|
343
|
+
errText = 'Module "' + moduleName + '" is not configured, cannot load.';
|
344
|
+
$log.error(errText);
|
345
|
+
deferred.reject(new Error(errText));
|
346
|
+
} else {
|
347
|
+
// deprecated
|
348
|
+
if(angular.isDefined(config.template)) {
|
349
|
+
if(angular.isUndefined(config.files)) {
|
350
|
+
config.files = [];
|
351
|
+
}
|
352
|
+
if(angular.isString(config.template)) {
|
353
|
+
config.files.push(config.template);
|
354
|
+
} else if(angular.isArray(config.template)) {
|
355
|
+
config.files.concat(config.template);
|
356
|
+
}
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
moduleCache.push = function(value) {
|
361
|
+
if(this.indexOf(value) === -1) {
|
362
|
+
Array.prototype.push.apply(this, arguments);
|
363
|
+
}
|
364
|
+
};
|
365
|
+
|
366
|
+
// If this module has been loaded before, re-use it.
|
367
|
+
if(angular.isDefined(moduleName) && moduleExists(moduleName) && regModules.indexOf(moduleName) !== -1) {
|
368
|
+
moduleCache.push(moduleName);
|
369
|
+
|
370
|
+
// if we don't want to load new files, resolve here
|
371
|
+
if(angular.isUndefined(config.files)) {
|
372
|
+
deferred.resolve();
|
373
|
+
return deferred.promise;
|
374
|
+
}
|
375
|
+
}
|
376
|
+
|
377
|
+
var loadDependencies = function loadDependencies(module) {
|
378
|
+
var moduleName,
|
379
|
+
loadedModule,
|
380
|
+
requires,
|
381
|
+
diff,
|
382
|
+
promisesList = [];
|
383
|
+
|
384
|
+
moduleName = getModuleName(module);
|
385
|
+
if(moduleName === null) {
|
386
|
+
return $q.when();
|
387
|
+
} else {
|
388
|
+
try {
|
389
|
+
loadedModule = getModule(moduleName);
|
390
|
+
} catch(e) {
|
391
|
+
var deferred = $q.defer();
|
392
|
+
$log.error(e.message);
|
393
|
+
deferred.reject(e);
|
394
|
+
return deferred.promise;
|
395
|
+
}
|
396
|
+
requires = getRequires(loadedModule);
|
397
|
+
}
|
398
|
+
|
399
|
+
angular.forEach(requires, function(requireEntry) {
|
400
|
+
// If no configuration is provided, try and find one from a previous load.
|
401
|
+
// If there isn't one, bail and let the normal flow run
|
402
|
+
if(typeof requireEntry === 'string') {
|
403
|
+
var config = self.getModuleConfig(requireEntry);
|
404
|
+
if(config === null) {
|
405
|
+
moduleCache.push(requireEntry); // We don't know about this module, but something else might, so push it anyway.
|
406
|
+
return;
|
407
|
+
}
|
408
|
+
requireEntry = config;
|
409
|
+
}
|
410
|
+
|
411
|
+
// Check if this dependency has been loaded previously
|
412
|
+
if(moduleExists(requireEntry.name)) {
|
413
|
+
if(typeof module !== 'string') {
|
414
|
+
// compare against the already loaded module to see if the new definition adds any new files
|
415
|
+
diff = requireEntry.files.filter(function (n) {
|
416
|
+
return self.getModuleConfig(requireEntry.name).files.indexOf(n) < 0;
|
417
|
+
});
|
418
|
+
|
419
|
+
// If the module was redefined, advise via the console
|
420
|
+
if (diff.length !== 0) {
|
421
|
+
$log.warn('Module "', moduleName, '" attempted to redefine configuration for dependency. "', requireEntry.name, '"\n Additional Files Loaded:', diff);
|
422
|
+
}
|
423
|
+
|
424
|
+
// Push everything to the file loader, it will weed out the duplicates.
|
425
|
+
promisesList.push(filesLoader(requireEntry.files, params).then(function () {
|
426
|
+
return loadDependencies(requireEntry);
|
427
|
+
}));
|
428
|
+
}
|
429
|
+
return;
|
430
|
+
} else if(typeof requireEntry === 'object') {
|
431
|
+
if(requireEntry.hasOwnProperty('name') && requireEntry['name']) {
|
432
|
+
// The dependency doesn't exist in the module cache and is a new configuration, so store and push it.
|
433
|
+
self.setModuleConfig(requireEntry);
|
434
|
+
moduleCache.push(requireEntry['name']);
|
435
|
+
}
|
436
|
+
|
437
|
+
// CSS Loading Handler
|
438
|
+
if(requireEntry.hasOwnProperty('css') && requireEntry['css'].length !== 0) {
|
439
|
+
// Locate the document insertion point
|
440
|
+
angular.forEach(requireEntry['css'], function(path) {
|
441
|
+
buildElement('css', path, params);
|
442
|
+
});
|
443
|
+
}
|
444
|
+
// CSS End.
|
445
|
+
}
|
446
|
+
|
447
|
+
// Check if the dependency has any files that need to be loaded. If there are, push a new promise to the promise list.
|
448
|
+
if(requireEntry.hasOwnProperty('files') && requireEntry.files.length !== 0) {
|
449
|
+
if(requireEntry.files) {
|
450
|
+
promisesList.push(filesLoader(requireEntry, params).then(function() {
|
451
|
+
return loadDependencies(requireEntry);
|
452
|
+
}));
|
453
|
+
}
|
454
|
+
}
|
455
|
+
});
|
456
|
+
|
457
|
+
// Create a wrapper promise to watch the promise list and resolve it once everything is done.
|
458
|
+
return $q.all(promisesList);
|
459
|
+
}
|
460
|
+
|
461
|
+
filesLoader(config, params).then(function success() {
|
462
|
+
if(moduleName === null) {
|
463
|
+
deferred.resolve(module);
|
464
|
+
} else {
|
465
|
+
moduleCache.push(moduleName);
|
466
|
+
loadDependencies(moduleName).then(function success() {
|
467
|
+
try {
|
468
|
+
justLoaded = [];
|
469
|
+
register(providers, moduleCache, params);
|
470
|
+
} catch(e) {
|
471
|
+
$log.error(e.message);
|
472
|
+
deferred.reject(e);
|
473
|
+
return;
|
474
|
+
}
|
475
|
+
$timeout(function() {
|
476
|
+
deferred.resolve(module);
|
477
|
+
});
|
478
|
+
}, function error(err) {
|
479
|
+
$timeout(function() {
|
480
|
+
deferred.reject(err);
|
481
|
+
});
|
482
|
+
});
|
483
|
+
}
|
484
|
+
}, function error(err) {
|
485
|
+
deferred.reject(err);
|
486
|
+
});
|
487
|
+
|
488
|
+
return deferred.promise;
|
489
|
+
}
|
490
|
+
};
|
491
|
+
}];
|
492
|
+
|
493
|
+
this.config = function(config) {
|
494
|
+
if(angular.isDefined(config.jsLoader) || angular.isDefined(config.asyncLoader)) {
|
495
|
+
jsLoader = config.jsLoader || config.asyncLoader;
|
496
|
+
if(!angular.isFunction(jsLoader)) {
|
497
|
+
throw('The js loader needs to be a function');
|
498
|
+
}
|
499
|
+
}
|
500
|
+
|
501
|
+
if(angular.isDefined(config.cssLoader)) {
|
502
|
+
cssLoader = config.cssLoader;
|
503
|
+
if(!angular.isFunction(cssLoader)) {
|
504
|
+
throw('The css loader needs to be a function');
|
505
|
+
}
|
506
|
+
}
|
507
|
+
|
508
|
+
if(angular.isDefined(config.templatesLoader)) {
|
509
|
+
templatesLoader = config.templatesLoader;
|
510
|
+
if(!angular.isFunction(templatesLoader)) {
|
511
|
+
throw('The template loader needs to be a function');
|
512
|
+
}
|
513
|
+
}
|
514
|
+
|
515
|
+
// for bootstrap apps, we need to define the main module name
|
516
|
+
if(angular.isDefined(config.loadedModules)) {
|
517
|
+
var addRegModule = function(loadedModule) {
|
518
|
+
if(regModules.indexOf(loadedModule) < 0) {
|
519
|
+
regModules.push(loadedModule);
|
520
|
+
angular.forEach(angular.module(loadedModule).requires, addRegModule);
|
521
|
+
}
|
522
|
+
};
|
523
|
+
angular.forEach(config.loadedModules, addRegModule);
|
524
|
+
}
|
525
|
+
|
526
|
+
// If we want to define modules configs
|
527
|
+
if(angular.isDefined(config.modules)) {
|
528
|
+
if(angular.isArray(config.modules)) {
|
529
|
+
angular.forEach(config.modules, function(moduleConfig) {
|
530
|
+
modules[moduleConfig.name] = moduleConfig;
|
531
|
+
});
|
532
|
+
} else {
|
533
|
+
modules[config.modules.name] = config.modules;
|
534
|
+
}
|
535
|
+
}
|
536
|
+
|
537
|
+
if(angular.isDefined(config.debug)) {
|
538
|
+
debug = config.debug;
|
539
|
+
}
|
540
|
+
|
541
|
+
if(angular.isDefined(config.events)) {
|
542
|
+
events = config.events;
|
543
|
+
}
|
544
|
+
};
|
545
|
+
}]);
|
546
|
+
|
547
|
+
ocLazyLoad.directive('ocLazyLoad', ['$http', '$log', '$ocLazyLoad', '$compile', '$timeout', '$templateCache', '$animate',
|
548
|
+
function($http, $log, $ocLazyLoad, $compile, $timeout, $templateCache, $animate) {
|
549
|
+
return {
|
550
|
+
restrict: 'A',
|
551
|
+
terminal: true,
|
552
|
+
priority: 401, // 1 more than ngInclude
|
553
|
+
transclude: 'element',
|
554
|
+
controller: angular.noop,
|
555
|
+
compile: function(element, attrs) {
|
556
|
+
return function($scope, $element, $attr, ctrl, $transclude) {
|
557
|
+
var childScope,
|
558
|
+
evaluated = $scope.$eval($attr.ocLazyLoad),
|
559
|
+
onloadExp = evaluated && evaluated.onload ? evaluated.onload : '';
|
560
|
+
|
561
|
+
/**
|
562
|
+
* Destroy the current scope of this element and empty the html
|
563
|
+
*/
|
564
|
+
function clearContent() {
|
565
|
+
if(childScope) {
|
566
|
+
childScope.$destroy();
|
567
|
+
childScope = null;
|
568
|
+
}
|
569
|
+
$element.html('');
|
570
|
+
}
|
571
|
+
|
572
|
+
/**
|
573
|
+
* Load a template from cache or url
|
574
|
+
* @param url
|
575
|
+
* @param callback
|
576
|
+
*/
|
577
|
+
function loadTemplate(url, callback) {
|
578
|
+
var view;
|
579
|
+
|
580
|
+
if(typeof(view = $templateCache.get(url)) !== 'undefined') {
|
581
|
+
callback(view);
|
582
|
+
} else {
|
583
|
+
$http.get(url)
|
584
|
+
.success(function(data) {
|
585
|
+
$templateCache.put('view:' + url, data);
|
586
|
+
callback(data);
|
587
|
+
})
|
588
|
+
.error(function(data) {
|
589
|
+
$log.error('Error load template "' + url + '": ' + data);
|
590
|
+
});
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
$scope.$watch($attr.ocLazyLoad, function(moduleName) {
|
595
|
+
if(angular.isDefined(moduleName)) {
|
596
|
+
$ocLazyLoad.load(moduleName).then(function(moduleConfig) {
|
597
|
+
$transclude($scope, function cloneConnectFn(clone) {
|
598
|
+
$animate.enter(clone, null, $element);
|
599
|
+
});
|
600
|
+
});
|
601
|
+
} else {
|
602
|
+
clearContent();
|
603
|
+
}
|
604
|
+
}, true);
|
605
|
+
};
|
606
|
+
}
|
607
|
+
/*link: function($scope, $element, $attr) {
|
608
|
+
|
609
|
+
}*/
|
610
|
+
};
|
611
|
+
}]);
|
612
|
+
|
613
|
+
/**
|
614
|
+
* Get the list of required modules/services/... for this module
|
615
|
+
* @param module
|
616
|
+
* @returns {Array}
|
617
|
+
*/
|
618
|
+
function getRequires(module) {
|
619
|
+
var requires = [];
|
620
|
+
angular.forEach(module.requires, function(requireModule) {
|
621
|
+
if(regModules.indexOf(requireModule) === -1) {
|
622
|
+
requires.push(requireModule);
|
623
|
+
}
|
624
|
+
});
|
625
|
+
return requires;
|
626
|
+
}
|
627
|
+
|
628
|
+
/**
|
629
|
+
* Check if a module exists and returns it if it does
|
630
|
+
* @param moduleName
|
631
|
+
* @returns {boolean}
|
632
|
+
*/
|
633
|
+
function moduleExists(moduleName) {
|
634
|
+
try {
|
635
|
+
return angular.module(moduleName);
|
636
|
+
} catch(e) {
|
637
|
+
if(/No module/.test(e) || (e.message.indexOf('$injector:nomod') > -1)) {
|
638
|
+
return false;
|
639
|
+
}
|
640
|
+
}
|
641
|
+
}
|
642
|
+
|
643
|
+
function getModule(moduleName) {
|
644
|
+
try {
|
645
|
+
return angular.module(moduleName);
|
646
|
+
} catch(e) {
|
647
|
+
// this error message really suxx
|
648
|
+
if(/No module/.test(e) || (e .message.indexOf('$injector:nomod') > -1)) {
|
649
|
+
e.message = 'The module "'+moduleName+'" that you are trying to load does not exist. ' + e.message
|
650
|
+
}
|
651
|
+
throw e;
|
652
|
+
}
|
653
|
+
}
|
654
|
+
|
655
|
+
function invokeQueue(providers, queue, moduleName, reconfig) {
|
656
|
+
if(!queue) {
|
657
|
+
return;
|
658
|
+
}
|
659
|
+
|
660
|
+
var i, len, args, provider;
|
661
|
+
for(i = 0, len = queue.length; i < len; i++) {
|
662
|
+
args = queue[i];
|
663
|
+
if(angular.isArray(args)) {
|
664
|
+
if(providers !== null) {
|
665
|
+
if(providers.hasOwnProperty(args[0])) {
|
666
|
+
provider = providers[args[0]];
|
667
|
+
} else {
|
668
|
+
throw new Error('unsupported provider ' + args[0]);
|
669
|
+
}
|
670
|
+
}
|
671
|
+
var isNew = registerInvokeList(args[2][0]);
|
672
|
+
if(args[1] !== 'invoke') {
|
673
|
+
if(isNew && angular.isDefined(provider)) {
|
674
|
+
provider[args[1]].apply(provider, args[2]);
|
675
|
+
}
|
676
|
+
} else { // config block
|
677
|
+
var callInvoke = function(fct) {
|
678
|
+
var invoked = regConfigs.indexOf(moduleName+'-'+fct);
|
679
|
+
if(invoked === -1 || reconfig) {
|
680
|
+
if(invoked === -1) {
|
681
|
+
regConfigs.push(moduleName+'-'+fct);
|
682
|
+
}
|
683
|
+
if(angular.isDefined(provider)) {
|
684
|
+
provider[args[1]].apply(provider, args[2]);
|
685
|
+
}
|
686
|
+
}
|
687
|
+
}
|
688
|
+
if(angular.isFunction(args[2][0])) {
|
689
|
+
callInvoke(args[2][0]);
|
690
|
+
} else if(angular.isArray(args[2][0])) {
|
691
|
+
for(var j = 0, jlen = args[2][0].length; j < jlen; j++) {
|
692
|
+
if(angular.isFunction(args[2][0][j])) {
|
693
|
+
callInvoke(args[2][0][j]);
|
694
|
+
}
|
695
|
+
}
|
696
|
+
}
|
697
|
+
}
|
698
|
+
}
|
699
|
+
}
|
700
|
+
}
|
701
|
+
|
702
|
+
/**
|
703
|
+
* Register a new module and load it
|
704
|
+
* @param providers
|
705
|
+
* @param registerModules
|
706
|
+
* @returns {*}
|
707
|
+
*/
|
708
|
+
function register(providers, registerModules, params) {
|
709
|
+
if(registerModules) {
|
710
|
+
var k, moduleName, moduleFn, runBlocks = [];
|
711
|
+
for(k = registerModules.length - 1; k >= 0; k--) {
|
712
|
+
moduleName = registerModules[k];
|
713
|
+
if(typeof moduleName !== 'string') {
|
714
|
+
moduleName = getModuleName(moduleName);
|
715
|
+
}
|
716
|
+
if(!moduleName || justLoaded.indexOf(moduleName) !== -1) {
|
717
|
+
continue;
|
718
|
+
}
|
719
|
+
var newModule = regModules.indexOf(moduleName) === -1;
|
720
|
+
moduleFn = angular.module(moduleName);
|
721
|
+
if(newModule) { // new module
|
722
|
+
regModules.push(moduleName);
|
723
|
+
register(providers, moduleFn.requires, params);
|
724
|
+
runBlocks = runBlocks.concat(moduleFn._runBlocks);
|
725
|
+
}
|
726
|
+
invokeQueue(providers, moduleFn._invokeQueue, moduleName, params.reconfig);
|
727
|
+
invokeQueue(providers, moduleFn._configBlocks, moduleName, params.reconfig); // angular 1.3+
|
728
|
+
broadcast(newModule ? 'ocLazyLoad.moduleLoaded' : 'ocLazyLoad.moduleReloaded', moduleName);
|
729
|
+
registerModules.pop();
|
730
|
+
justLoaded.push(moduleName);
|
731
|
+
}
|
732
|
+
var instanceInjector = providers.getInstanceInjector();
|
733
|
+
angular.forEach(runBlocks, function(fn) {
|
734
|
+
instanceInjector.invoke(fn);
|
735
|
+
});
|
736
|
+
}
|
737
|
+
}
|
738
|
+
|
739
|
+
/**
|
740
|
+
* Register an invoke
|
741
|
+
* @param invokeList
|
742
|
+
* @returns {*}
|
743
|
+
*/
|
744
|
+
function registerInvokeList(invokeList) {
|
745
|
+
var newInvoke = false;
|
746
|
+
var onInvoke = function(invokeName) {
|
747
|
+
newInvoke = true;
|
748
|
+
regInvokes.push(invokeName);
|
749
|
+
broadcast('ocLazyLoad.componentLoaded', invokeName);
|
750
|
+
}
|
751
|
+
if(angular.isString(invokeList)) {
|
752
|
+
if(regInvokes.indexOf(invokeList) === -1) {
|
753
|
+
onInvoke(invokeList);
|
754
|
+
}
|
755
|
+
} else if(angular.isObject(invokeList)) {
|
756
|
+
angular.forEach(invokeList, function(invoke) {
|
757
|
+
if(angular.isString(invoke) && regInvokes.indexOf(invoke) === -1) {
|
758
|
+
onInvoke(invoke);
|
759
|
+
}
|
760
|
+
});
|
761
|
+
} else {
|
762
|
+
return true;
|
763
|
+
}
|
764
|
+
return newInvoke;
|
765
|
+
}
|
766
|
+
|
767
|
+
function getModuleName(module) {
|
768
|
+
if(module === null) {
|
769
|
+
return null;
|
770
|
+
}
|
771
|
+
var moduleName = null;
|
772
|
+
if(typeof module === 'string') {
|
773
|
+
moduleName = module;
|
774
|
+
} else if(typeof module === 'object' && module.hasOwnProperty('name') && typeof module.name === 'string') {
|
775
|
+
moduleName = module.name;
|
776
|
+
}
|
777
|
+
return moduleName;
|
778
|
+
}
|
779
|
+
|
780
|
+
/**
|
781
|
+
* Get the list of existing registered modules
|
782
|
+
* @param element
|
783
|
+
*/
|
784
|
+
function init(element) {
|
785
|
+
var elements = [element],
|
786
|
+
appElement,
|
787
|
+
moduleName,
|
788
|
+
names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],
|
789
|
+
NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
|
790
|
+
|
791
|
+
function append(elm) {
|
792
|
+
return (elm && elements.push(elm));
|
793
|
+
}
|
794
|
+
|
795
|
+
angular.forEach(names, function(name) {
|
796
|
+
names[name] = true;
|
797
|
+
append(document.getElementById(name));
|
798
|
+
name = name.replace(':', '\\:');
|
799
|
+
if(element.querySelectorAll) {
|
800
|
+
angular.forEach(element.querySelectorAll('.' + name), append);
|
801
|
+
angular.forEach(element.querySelectorAll('.' + name + '\\:'), append);
|
802
|
+
angular.forEach(element.querySelectorAll('[' + name + ']'), append);
|
803
|
+
}
|
804
|
+
});
|
805
|
+
|
806
|
+
//TODO: search the script tags for angular.bootstrap
|
807
|
+
angular.forEach(elements, function(elm) {
|
808
|
+
if(!appElement) {
|
809
|
+
var className = ' ' + element.className + ' ';
|
810
|
+
var match = NG_APP_CLASS_REGEXP.exec(className);
|
811
|
+
if(match) {
|
812
|
+
appElement = elm;
|
813
|
+
moduleName = (match[2] || '').replace(/\s+/g, ',');
|
814
|
+
} else {
|
815
|
+
angular.forEach(elm.attributes, function(attr) {
|
816
|
+
if(!appElement && names[attr.name]) {
|
817
|
+
appElement = elm;
|
818
|
+
moduleName = attr.value;
|
819
|
+
}
|
820
|
+
});
|
821
|
+
}
|
822
|
+
}
|
823
|
+
});
|
824
|
+
|
825
|
+
if(appElement) {
|
826
|
+
(function addReg(moduleName) {
|
827
|
+
if(regModules.indexOf(moduleName) === -1) {
|
828
|
+
// register existing modules
|
829
|
+
regModules.push(moduleName);
|
830
|
+
var mainModule = angular.module(moduleName);
|
831
|
+
|
832
|
+
// register existing components (directives, services, ...)
|
833
|
+
invokeQueue(null, mainModule._invokeQueue, moduleName);
|
834
|
+
invokeQueue(null, mainModule._configBlocks, moduleName); // angular 1.3+
|
835
|
+
|
836
|
+
angular.forEach(mainModule.requires, addReg);
|
837
|
+
}
|
838
|
+
})(moduleName);
|
839
|
+
}
|
840
|
+
}
|
841
|
+
|
842
|
+
// Array.indexOf polyfill for IE8
|
843
|
+
if (!Array.prototype.indexOf) {
|
844
|
+
Array.prototype.indexOf = function (searchElement, fromIndex) {
|
845
|
+
|
846
|
+
var k;
|
847
|
+
|
848
|
+
// 1. Let O be the result of calling ToObject passing
|
849
|
+
// the this value as the argument.
|
850
|
+
if (this == null) {
|
851
|
+
throw new TypeError('"this" is null or not defined');
|
852
|
+
}
|
853
|
+
|
854
|
+
var O = Object(this);
|
855
|
+
|
856
|
+
// 2. Let lenValue be the result of calling the Get
|
857
|
+
// internal method of O with the argument "length".
|
858
|
+
// 3. Let len be ToUint32(lenValue).
|
859
|
+
var len = O.length >>> 0;
|
860
|
+
|
861
|
+
// 4. If len is 0, return -1.
|
862
|
+
if (len === 0) {
|
863
|
+
return -1;
|
864
|
+
}
|
865
|
+
|
866
|
+
// 5. If argument fromIndex was passed let n be
|
867
|
+
// ToInteger(fromIndex); else let n be 0.
|
868
|
+
var n = +fromIndex || 0;
|
869
|
+
|
870
|
+
if (Math.abs(n) === Infinity) {
|
871
|
+
n = 0;
|
872
|
+
}
|
873
|
+
|
874
|
+
// 6. If n >= len, return -1.
|
875
|
+
if (n >= len) {
|
876
|
+
return -1;
|
877
|
+
}
|
878
|
+
|
879
|
+
// 7. If n >= 0, then Let k be n.
|
880
|
+
// 8. Else, n<0, Let k be len - abs(n).
|
881
|
+
// If k is less than 0, then let k be 0.
|
882
|
+
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
883
|
+
|
884
|
+
// 9. Repeat, while k < len
|
885
|
+
while (k < len) {
|
886
|
+
// a. Let Pk be ToString(k).
|
887
|
+
// This is implicit for LHS operands of the in operator
|
888
|
+
// b. Let kPresent be the result of calling the
|
889
|
+
// HasProperty internal method of O with argument Pk.
|
890
|
+
// This step can be combined with c
|
891
|
+
// c. If kPresent is true, then
|
892
|
+
// i. Let elementK be the result of calling the Get
|
893
|
+
// internal method of O with the argument ToString(k).
|
894
|
+
// ii. Let same be the result of applying the
|
895
|
+
// Strict Equality Comparison Algorithm to
|
896
|
+
// searchElement and elementK.
|
897
|
+
// iii. If same is true, return k.
|
898
|
+
if (k in O && O[k] === searchElement) {
|
899
|
+
return k;
|
900
|
+
}
|
901
|
+
k++;
|
902
|
+
}
|
903
|
+
return -1;
|
904
|
+
};
|
905
|
+
}
|
906
|
+
})();
|