redmine_extensions 0.2.10 → 0.2.11
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/redmine_extensions/application.js +0 -1
- data/app/assets/javascripts/redmine_extensions/blocking.js +2 -1
- data/app/assets/javascripts/redmine_extensions/blocking_dynamic_loading.js +53 -0
- data/app/assets/javascripts/redmine_extensions/blocking_module.js +208 -127
- data/app/assets/javascripts/redmine_extensions/blocking_schedule.js +50 -33
- data/app/views/easy_front_end/_easy_front_end.html.erb +2 -2
- data/lib/generators/redmine_extensions/entity/templates/index.api.rsb.erb +5 -5
- data/lib/generators/redmine_extensions/entity/templates/mail_added.html.erb.erb +1 -1
- data/lib/generators/redmine_extensions/entity/templates/mail_added.text.erb.erb +2 -2
- data/lib/generators/redmine_extensions/entity/templates/mail_updated.text.erb.erb +2 -2
- data/lib/generators/redmine_extensions/entity/templates/routes.rb.erb +12 -12
- data/lib/redmine_extensions/version.rb +1 -1
- metadata +12 -12
- data/app/assets/javascripts/redmine_extensions/dynamic_loading.js +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b6908fe3fa7949e58a19003cbc84109a5aa1d99
|
4
|
+
data.tar.gz: ef57c4be4e0d348483a6f44d3d31920fbb22f0c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fbc838412a96e26c5c068af3c641404bdd11bb87237935826c8ffe33ebdae4b758d76ffa60b61f4670888a43bcc8b63267c87a45370e3c70a57d56241bfd8b7
|
7
|
+
data.tar.gz: be933bea060cdb21c914b7e8d91504f8442426ec2b3ecf2923165f271e80b8d6c84446ada363068d23c01a5269d86ebf8d8e65cfb8c95b360eda42796ced39c5
|
@@ -4,7 +4,8 @@
|
|
4
4
|
//= require ./blocking_namespace
|
5
5
|
// require ./event_bus
|
6
6
|
//= require ./blocking_schedule
|
7
|
-
|
7
|
+
//= require ./blocking_module
|
8
8
|
//= require ./blocking_polyfill
|
9
9
|
//= require ./blocking_render
|
10
10
|
//= require ./blocking_utils
|
11
|
+
//= require ./blocking_dynamic_loading
|
@@ -0,0 +1,53 @@
|
|
1
|
+
(function () {
|
2
|
+
var alreadyLoaded = {};
|
3
|
+
EasyGem.dynamic = {
|
4
|
+
_alreadyLoaded: alreadyLoaded,
|
5
|
+
/**
|
6
|
+
* Append Javascript <script> tag to page
|
7
|
+
* @example
|
8
|
+
* EasyGem.dynamic.jsTag("/plugin_assets/my_plugin/javascripts/counter.js");
|
9
|
+
* EasyGem.schedule.require(function(counter){
|
10
|
+
* setInterval(counter.count(), 1000);
|
11
|
+
* }, function(){
|
12
|
+
* return window.utils.counter;
|
13
|
+
* })
|
14
|
+
* @param {String} src - absolute path to requested file
|
15
|
+
*/
|
16
|
+
jsTag: function (src) {
|
17
|
+
if (alreadyLoaded[src]) return;
|
18
|
+
alreadyLoaded[src] = true;
|
19
|
+
var jsScript = document.createElement("script");
|
20
|
+
jsScript.setAttribute("src", src);
|
21
|
+
jsScript.setAttribute("defer", "true");
|
22
|
+
document.head.appendChild(jsScript);
|
23
|
+
},
|
24
|
+
/**
|
25
|
+
* Append CSS <link> tag to page
|
26
|
+
* @param {String} src - absolute path to requested file
|
27
|
+
*/
|
28
|
+
cssTag: function (src) {
|
29
|
+
if (alreadyLoaded[src]) return;
|
30
|
+
alreadyLoaded[src] = true;
|
31
|
+
var link = document.createElement('link');
|
32
|
+
link.rel = "stylesheet";
|
33
|
+
link.type = "text/css";
|
34
|
+
link.href = src;
|
35
|
+
link.media = "all";
|
36
|
+
document.head.appendChild(link);
|
37
|
+
},
|
38
|
+
/**
|
39
|
+
* Load multiple JS files into page
|
40
|
+
* @param {Array.<String>} array
|
41
|
+
*/
|
42
|
+
jsTags: function (array) {
|
43
|
+
array.forEach(this.jsTag);
|
44
|
+
},
|
45
|
+
/**
|
46
|
+
* Load multiple CSS files into page
|
47
|
+
* @param {Array.<String>} array
|
48
|
+
*/
|
49
|
+
cssTags: function (array) {
|
50
|
+
array.forEach(this.cssTag);
|
51
|
+
}
|
52
|
+
};
|
53
|
+
})();
|
@@ -1,163 +1,244 @@
|
|
1
1
|
(function () {
|
2
2
|
"use strict";
|
3
|
-
return;
|
4
3
|
|
5
|
-
var
|
6
|
-
|
7
|
-
var
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
var getMissingModule = function (dependencyNames) {
|
13
|
-
for (var i = 0; i < dependencyNames.length; i++) {
|
14
|
-
var dependencyName = dependencyNames[i];
|
15
|
-
var dependency = modules[dependencyName];
|
16
|
-
if (!dependency || !dependency.instance) return dependencyName;
|
17
|
-
}
|
18
|
-
return null;
|
19
|
-
};
|
20
|
-
|
21
|
-
EASY.eventBus.on("moduleReady", function (moduleName) {
|
22
|
-
if (waiters[moduleName]) {
|
23
|
-
var subWaiters = waiters[moduleName];
|
24
|
-
delete waiters[moduleName];
|
25
|
-
delete modulesOrdered[moduleName];
|
26
|
-
subWaiters.forEach(function (pack) {
|
27
|
-
requireTry(pack);
|
28
|
-
})
|
29
|
-
}
|
30
|
-
});
|
4
|
+
var moduleInstances = {};
|
5
|
+
/** @type {Object.<String,EasyModule>} */
|
6
|
+
var moduleDefinitions = {};
|
7
|
+
/** @type {Array.<Waiter>} */
|
8
|
+
var waiters = [];
|
9
|
+
/** @type {Object.<String,String>} */
|
10
|
+
var urls = {};
|
31
11
|
|
12
|
+
function Waiter(dependencies, callback) {
|
13
|
+
this.dependencies = dependencies;
|
14
|
+
this.callback = callback;
|
15
|
+
}
|
32
16
|
|
33
17
|
/**
|
34
|
-
* @property {Function} factory
|
35
18
|
* @property {String} name
|
36
|
-
* @property {Array.<
|
19
|
+
* @property {Array.<String>} dependencies
|
20
|
+
* @property {Array.<Waiter>} waiters
|
37
21
|
* @constructor
|
38
22
|
*/
|
39
|
-
function
|
23
|
+
function EasyModule(moduleName) {
|
40
24
|
this.name = moduleName;
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
this.construct();
|
45
|
-
}
|
25
|
+
setTimeout(function () {
|
26
|
+
executeWaiters();
|
27
|
+
}, 0);
|
46
28
|
}
|
47
29
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
var
|
56
|
-
|
57
|
-
|
58
|
-
|
30
|
+
/**
|
31
|
+
* @methodOf EasyModule
|
32
|
+
*/
|
33
|
+
EasyModule.prototype.checkDependencies = function () {
|
34
|
+
if (!checkDependencies(this.dependencies)) return false;
|
35
|
+
var instance = {};
|
36
|
+
var waiters = this.waiters;
|
37
|
+
for (var i = 0; i < waiters.length; i++) {
|
38
|
+
var waiter = waiters[i];
|
39
|
+
var instances = waiter.dependencies.map(function (moduleName) {
|
40
|
+
return moduleInstances[moduleName];
|
41
|
+
});
|
42
|
+
instance = waiter.callback.apply(instance, instances) || instance;
|
59
43
|
}
|
44
|
+
moduleInstances[this.name] = instance;
|
45
|
+
};
|
46
|
+
|
47
|
+
function checkDependencies(dependencies) {
|
48
|
+
// console.log({dependencies: dependencies,instances:Object.keys(moduleInstances),definitions:Object.keys(moduleDefinitions)});
|
49
|
+
for (var i = 0; i < dependencies.length; i++) {
|
50
|
+
/** @type {String} */
|
51
|
+
var dependency = dependencies[i];
|
52
|
+
if (moduleInstances[dependency]) continue;
|
53
|
+
if (!moduleDefinitions[dependency]) {
|
60
54
|
|
61
|
-
|
62
|
-
|
63
|
-
/** @type {Module} */
|
64
|
-
var dependency;
|
65
|
-
for (var i = 0; i < this.dependencies.length; i++) {
|
66
|
-
dependency = this.dependencies[i];
|
67
|
-
if (dependency.instance) {
|
68
|
-
dependencyInstances.push(dependency.instance);
|
69
|
-
} else {
|
70
|
-
return dependency.construct(visited.concat([this.name]));
|
55
|
+
for (var j = i; j < dependencies.length; j++) {
|
56
|
+
loadModule(dependencies[j]);
|
71
57
|
}
|
58
|
+
return false;
|
72
59
|
}
|
60
|
+
moduleDefinitions[dependency].checkDependencies();
|
61
|
+
if (!moduleInstances[dependency]) return false;
|
73
62
|
}
|
74
|
-
|
75
|
-
|
76
|
-
EASY.eventBus.fire("moduleReady", this.name);
|
77
|
-
} else {
|
78
|
-
var self = this;
|
79
|
-
setTimeout(function () {
|
80
|
-
self.construct();
|
81
|
-
}, 10);
|
82
|
-
}
|
83
|
-
};
|
63
|
+
return true;
|
64
|
+
}
|
84
65
|
|
85
|
-
|
86
|
-
var
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
66
|
+
function executeWaiter(waiter) {
|
67
|
+
var instances = waiter.dependencies.map(function (moduleName) {
|
68
|
+
return moduleInstances[moduleName];
|
69
|
+
});
|
70
|
+
waiter.callback.apply(window, instances);
|
71
|
+
}
|
72
|
+
|
73
|
+
function executeWaiters() {
|
74
|
+
var executed = false;
|
75
|
+
for (var i = 0; i < waiters.length; i++) {
|
76
|
+
var waiter = waiters[i];
|
77
|
+
if (checkDependencies(waiter.dependencies)) {
|
78
|
+
executeWaiter(waiter);
|
79
|
+
executed = true;
|
80
|
+
waiters[i] = null;
|
96
81
|
}
|
97
|
-
dependencyInstances.push(dependency.instance);
|
98
|
-
}
|
99
|
-
return dependencyInstances;
|
100
|
-
};
|
101
|
-
/**
|
102
|
-
* @param {{dependencies:Array.<String>,body:Function,context:Object}} pack
|
103
|
-
*/
|
104
|
-
var requireTry = function (pack) {
|
105
|
-
var dependencyInstances = getDependencies(pack.dependencies);
|
106
|
-
if (dependencyInstances !== null) {
|
107
|
-
return pack.body.apply([pack.context || window].concat(dependencyInstances));
|
108
|
-
}
|
109
|
-
var missingModule = getMissingModule(pack.dependencies);
|
110
|
-
if (missingModule === null) return;
|
111
|
-
if (!modules[missingModule]) {
|
112
|
-
modulesOrdered[missingModule] = true;
|
113
82
|
}
|
83
|
+
waiters = waiters.filter(function (item) {
|
84
|
+
return item;
|
85
|
+
})
|
86
|
+
}
|
114
87
|
|
115
|
-
|
116
|
-
|
88
|
+
function loadModule(moduleName) {
|
89
|
+
var url = urls[moduleName];
|
90
|
+
if (url) {
|
91
|
+
EasyGem.dynamic.jsTag(url);
|
117
92
|
}
|
118
|
-
|
119
|
-
};
|
93
|
+
}
|
120
94
|
|
95
|
+
function findMissingModules() {
|
96
|
+
var moduleMap = {};
|
97
|
+
for (var i = 0; i < waiters.length; i++) {
|
98
|
+
missingModules(waiters[i].dependencies, moduleMap);
|
99
|
+
}
|
100
|
+
var modules = Object.keys(moduleMap);
|
101
|
+
if (modules.length > 0) {
|
102
|
+
throw "Missing modules: " + modules.join(", ");
|
103
|
+
}
|
104
|
+
}
|
121
105
|
|
122
|
-
|
106
|
+
function missingModules(dependencies, modules) {
|
107
|
+
for (var i = 0; i < dependencies.length; i++) {
|
108
|
+
/** @type {String} */
|
109
|
+
var dependency = dependencies[i];
|
110
|
+
if (moduleInstances[dependency]) continue;
|
111
|
+
if (!moduleDefinitions[dependency]) {
|
112
|
+
modules[dependency] = true;
|
113
|
+
continue;
|
114
|
+
}
|
115
|
+
missingModules(moduleDefinitions[dependency].dependencies, modules);
|
116
|
+
}
|
117
|
+
}
|
123
118
|
|
124
119
|
/**
|
125
|
-
*
|
126
|
-
*
|
127
|
-
* @param {String} moduleName
|
128
|
-
* @param {Array.<String>} dependencies
|
129
|
-
* @param {Function} factory
|
120
|
+
*
|
121
|
+
* @type {{urls: Object<String, String>, module: EasyGem.module.module, part: EasyGem.module.part, transform: EasyGem.module.transform, setUrl: EasyGem.module.setUrl}}
|
130
122
|
*/
|
131
|
-
|
132
|
-
|
123
|
+
EasyGem.module = {
|
124
|
+
/**
|
125
|
+
* Object containing urls for modules. Filling the urls is recommended to do in <head>.
|
126
|
+
* Use [moduleName] as key and absolute path (with or without a hostname) as value
|
127
|
+
* If url have to be specified later, use EasyGem.module.setUrl() instead.
|
128
|
+
* @type {Object<String, String>}
|
129
|
+
* @example
|
130
|
+
* EasyGem.module.urls["myModule"] = "/assets/my_module.js"
|
131
|
+
*/
|
132
|
+
urls: urls,
|
133
|
+
/**
|
134
|
+
* Define module in one separate file. Use this method as first line of the file
|
135
|
+
* Module can be downloaded on-demand by loadModules() if url is provided by setUrl() function.
|
136
|
+
* @example
|
137
|
+
* EasyGem.module.module("myModule", ["jQuery", "c3"], function($, c3) {
|
138
|
+
* return {
|
139
|
+
* init: function(){
|
140
|
+
* c3.init($("#graph"));
|
141
|
+
* }
|
142
|
+
* }
|
143
|
+
* }
|
144
|
+
* @param {String} moduleName
|
145
|
+
* @param {Array.<String>} prerequisites - other modules needed for construction of module
|
146
|
+
* @param {Function} getter - factory function
|
147
|
+
*/
|
148
|
+
module: function (moduleName, prerequisites, getter) {
|
149
|
+
var module = moduleDefinitions[moduleName] = new EasyModule(moduleName);
|
150
|
+
module.dependencies = prerequisites;
|
151
|
+
module.waiters = [new Waiter(prerequisites, getter)];
|
152
|
+
},
|
153
|
+
/**
|
154
|
+
* Define module part if module code is distributed into many separate files.
|
155
|
+
* For dynamic loading by url, all files have to be combine by pipeline into one.
|
156
|
+
* Module is executed only if all [prerequisites] from all parts of the module is fulfilled, but only part's
|
157
|
+
* [prerequisites] will be used as arguments for [getter].
|
158
|
+
* [prerequisites] argument can be omitted if no prerequisites are required
|
159
|
+
* @param {String} moduleName
|
160
|
+
* @param {Array.<String>|Function} prerequisites
|
161
|
+
* @param {Function} [getter]
|
162
|
+
*/
|
163
|
+
part: function (moduleName, prerequisites, getter) {
|
164
|
+
if (getter === undefined) {
|
165
|
+
getter = prerequisites;
|
166
|
+
prerequisites = [];
|
167
|
+
}
|
168
|
+
var module = moduleDefinitions[moduleName];
|
169
|
+
if (!module){
|
170
|
+
module = moduleDefinitions[moduleName] = new EasyModule(moduleName);
|
171
|
+
module.waiters = [];
|
172
|
+
module.dependencies = [];
|
173
|
+
}
|
174
|
+
module.waiters.push(new Waiter(prerequisites, getter));
|
175
|
+
for (var i = 0; i < prerequisites.length; i++) {
|
176
|
+
var prerequisite = prerequisites[i];
|
177
|
+
if (module.dependencies.indexOf(prerequisite) === -1) {
|
178
|
+
module.dependencies.push(prerequisite);
|
179
|
+
}
|
180
|
+
}
|
181
|
+
},
|
182
|
+
/**
|
183
|
+
* Transform simple EasyGem.schedule.require [prerequisite] into proper module.
|
184
|
+
* Use it sparingly if module have to be defined for usage in other modules as prerequisite.
|
185
|
+
* If named getter is saved by EasyGem.schedule.define, the name can also be used.
|
186
|
+
* @param {String} moduleName
|
187
|
+
* @param {String|Function} prerequisite - getter function
|
188
|
+
* @example
|
189
|
+
* EasyGem.module.transform("c3", function() {
|
190
|
+
* return window.c3;
|
191
|
+
* });
|
192
|
+
* -- OR --
|
193
|
+
* EasyGem.module.transform("c3", "c3");
|
194
|
+
*/
|
195
|
+
transform: function (moduleName, prerequisite) {
|
196
|
+
EasyGem.schedule.require(function (instance) {
|
197
|
+
moduleInstances[moduleName] = instance;
|
198
|
+
executeWaiters();
|
199
|
+
}, prerequisite);
|
200
|
+
},
|
201
|
+
/**
|
202
|
+
* Save url for later dynamic load of the module. Use it only if url is defined later in page parsing.
|
203
|
+
* If you can specify url in header, use EasyGem.module.urls object instead;
|
204
|
+
* @param {String} moduleName
|
205
|
+
* @param {String} url - absolute url of the module file, with or without hostname
|
206
|
+
*/
|
207
|
+
setUrl: function (moduleName, url) {
|
208
|
+
urls[moduleName] = url;
|
209
|
+
executeWaiters();
|
210
|
+
}
|
133
211
|
};
|
134
212
|
/**
|
135
|
-
*
|
136
|
-
*
|
213
|
+
* Load specified modules and execute [callback].
|
214
|
+
* Module instances are constructed if not constructed before.
|
215
|
+
* Missing modules are downloaded if url is provided.
|
216
|
+
* @param {Array.<String>} moduleNames
|
217
|
+
* @param {Function} callback - function with module instances as arguments
|
218
|
+
* @example
|
219
|
+
* EasyGem.loadModules(["jQuery", "myModule"], function($, myModule) {
|
220
|
+
* myModule.init($("#my_module_container"));
|
221
|
+
* });
|
137
222
|
*/
|
138
|
-
|
139
|
-
|
223
|
+
EasyGem.loadModules = function (moduleNames, callback) {
|
224
|
+
var waiter = new Waiter(moduleNames, callback);
|
225
|
+
if (checkDependencies(moduleNames)) {
|
226
|
+
executeWaiter(waiter);
|
227
|
+
} else {
|
228
|
+
waiters.push(waiter);
|
229
|
+
setTimeout(findMissingModules, 5000);
|
230
|
+
}
|
140
231
|
};
|
141
232
|
/**
|
142
|
-
*
|
143
|
-
* @param {
|
144
|
-
* @param {
|
233
|
+
* Same as EasyGem.loadModules, but only for one module.
|
234
|
+
* @param {String} moduleName
|
235
|
+
* @param {Function} callback - function with the module instance as first argument
|
145
236
|
*/
|
146
|
-
|
147
|
-
|
148
|
-
requireTry({dependencies: dependencies, body: body, context: context});
|
237
|
+
EasyGem.loadModule = function (moduleName, callback) {
|
238
|
+
this.loadModules([moduleName], callback);
|
149
239
|
};
|
150
|
-
|
240
|
+
var transform = EasyGem.module.transform;
|
241
|
+
transform("jQuery", "jQuery");
|
242
|
+
transform("jQueryUI", "jQueryUI");
|
151
243
|
|
152
|
-
EASY.modules.toModule("jQuery", function () {
|
153
|
-
return window.jQuery;
|
154
|
-
});
|
155
|
-
EASY.modules.toModule("$", function () {
|
156
|
-
return window.jQuery;
|
157
|
-
});
|
158
|
-
EASY.modules.toModule("jQueryUI", function () {
|
159
|
-
if (window.jQuery && window.jQuery.widget) {
|
160
|
-
return window.jQuery;
|
161
|
-
}
|
162
|
-
});
|
163
244
|
})();
|
@@ -86,9 +86,25 @@
|
|
86
86
|
if (prerequisiteArray.length === 0) return 0;
|
87
87
|
var count = 0;
|
88
88
|
for (var i = 0; i < prerequisiteArray.length; i++) {
|
89
|
-
|
89
|
+
var pack = prerequisiteArray[i];
|
90
|
+
if (!pack) {
|
90
91
|
count++;
|
91
|
-
|
92
|
+
continue;
|
93
|
+
}
|
94
|
+
if (pack.pre) {
|
95
|
+
var instance = preparePrerequisite(pack.pre);
|
96
|
+
if (instance) {
|
97
|
+
count++;
|
98
|
+
prerequisiteArray[i] = null;
|
99
|
+
pack.func.call(window, instance);
|
100
|
+
}
|
101
|
+
} else {
|
102
|
+
var instances = prepareMorePrerequisites(pack.pres);
|
103
|
+
if (instances) {
|
104
|
+
count++;
|
105
|
+
prerequisiteArray[i] = null;
|
106
|
+
pack.func.apply(window, instances);
|
107
|
+
}
|
92
108
|
}
|
93
109
|
}
|
94
110
|
if (count) {
|
@@ -97,28 +113,6 @@
|
|
97
113
|
}
|
98
114
|
return count;
|
99
115
|
};
|
100
|
-
var executeOnePrerequisite = function (pack) {
|
101
|
-
var getter, getters, instance, instances;
|
102
|
-
if (getter = pack.pre) {
|
103
|
-
instance = preparePrerequisite(getter);
|
104
|
-
if (instance) {
|
105
|
-
pack.func.call(window, instance);
|
106
|
-
return true;
|
107
|
-
}
|
108
|
-
return false;
|
109
|
-
} else if (getters = pack.pres) {
|
110
|
-
instances = [];
|
111
|
-
for (var j = 0; j < getters.length; j++) {
|
112
|
-
getter = getters[j];
|
113
|
-
instance = preparePrerequisite(getter);
|
114
|
-
if (!instance) break;
|
115
|
-
instances.push(instance);
|
116
|
-
}
|
117
|
-
if (instances.length !== getters.length) return false;
|
118
|
-
pack.func.apply(window, instances);
|
119
|
-
return true;
|
120
|
-
}
|
121
|
-
};
|
122
116
|
/**
|
123
117
|
* @param {(Function|string)} getter
|
124
118
|
* @return {(Object|null)}
|
@@ -140,6 +134,15 @@
|
|
140
134
|
return getter();
|
141
135
|
}
|
142
136
|
};
|
137
|
+
var prepareMorePrerequisites = function (getters) {
|
138
|
+
var instance, instances = [];
|
139
|
+
for (var j = 0; j < getters.length; j++) {
|
140
|
+
instance = preparePrerequisite(getters[j]);
|
141
|
+
if (!instance) return null;
|
142
|
+
instances.push(instance);
|
143
|
+
}
|
144
|
+
return instances;
|
145
|
+
};
|
143
146
|
|
144
147
|
var cycle = function scheduleCycle() {
|
145
148
|
setTimeout(cycle, 30);
|
@@ -148,7 +151,7 @@
|
|
148
151
|
document.addEventListener("DOMContentLoaded", cycle);
|
149
152
|
/**
|
150
153
|
*
|
151
|
-
* @type {{
|
154
|
+
* @type {{late: EasyGem.schedule.late, require: EasyGem.schedule.require, main: EasyGem.schedule.main, define: EasyGem.schedule.define}}
|
152
155
|
*/
|
153
156
|
EasyGem.schedule = {
|
154
157
|
/**
|
@@ -187,17 +190,21 @@
|
|
187
190
|
pres.push(arguments[i]);
|
188
191
|
}
|
189
192
|
}
|
190
|
-
var
|
191
|
-
if (
|
192
|
-
|
193
|
+
var instances = prepareMorePrerequisites(pres);
|
194
|
+
if (instances) {
|
195
|
+
func.apply(window, instances);
|
196
|
+
} else {
|
197
|
+
prerequisiteArray.push({func: func, pres: pres});
|
193
198
|
}
|
194
199
|
} else {
|
195
200
|
if (typeof prerequisite === "string") {
|
196
201
|
prerequisite = prerequisite.toLowerCase();
|
197
202
|
}
|
198
|
-
|
199
|
-
if (
|
200
|
-
|
203
|
+
var instance = preparePrerequisite(prerequisite);
|
204
|
+
if (instance) {
|
205
|
+
func.call(window, instance);
|
206
|
+
} else {
|
207
|
+
prerequisiteArray.push({func: func, pre: prerequisite});
|
201
208
|
}
|
202
209
|
}
|
203
210
|
},
|
@@ -223,9 +230,19 @@
|
|
223
230
|
* });
|
224
231
|
* @param {string} name
|
225
232
|
* @param {Function} getter - getter or constructor
|
233
|
+
* @param {...(SchedulePrerequisite|string)} [prerequisite] - more than one prerequisite can be specified here
|
234
|
+
* as rest parameters. Function or String are accepted. If String is used,
|
235
|
+
* predefined getter from [moduleGetters] or getter defined by [define]
|
236
|
+
* are called.
|
226
237
|
*/
|
227
|
-
define: function (name, getter) {
|
228
|
-
|
238
|
+
define: function (name, getter, prerequisite) {
|
239
|
+
if (prerequisite) {
|
240
|
+
this.require.apply(this, [function () {
|
241
|
+
moduleGetters[name.toLowerCase()] = getter;
|
242
|
+
}].concat(Array.prototype.slice.call(arguments, 2)));
|
243
|
+
} else {
|
244
|
+
moduleGetters[name.toLowerCase()] = getter;
|
245
|
+
}
|
229
246
|
}
|
230
247
|
};
|
231
248
|
EASY.schedule = EasyGem.schedule;
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<%=
|
3
3
|
if params['combine_by_pipeline'].nil?
|
4
4
|
if Rails.env.development? && ENV['DART'] == '1'
|
5
|
-
javascript_include_tag('dart/localhost', plugin: plugin)
|
5
|
+
javascript_include_tag('dart/localhost', plugin: plugin, defer: true)
|
6
6
|
else
|
7
7
|
javascript_include_tag("#{plugin}.dart", defer: true)
|
8
8
|
end
|
@@ -10,7 +10,7 @@
|
|
10
10
|
if params['combine_by_pipeline'] == 'false'
|
11
11
|
#javascript_include_tag('dart/debug', plugin: plugin, defer: true)
|
12
12
|
if ENV['DART'] == '1'
|
13
|
-
javascript_include_tag('dart/localhost', plugin: plugin)
|
13
|
+
javascript_include_tag('dart/localhost', plugin: plugin, defer: true)
|
14
14
|
end
|
15
15
|
else
|
16
16
|
javascript_include_tag("#{plugin}.dart", defer: true)
|
@@ -1,5 +1,5 @@
|
|
1
|
-
api.array :<%= model_name_pluralize_underscored %>, api_meta(total_count: @entity_count, offset: @offset, limit: @limit) do
|
2
|
-
@entities.each do |<%= model_name_underscored %>|
|
3
|
-
render_api_<%= model_name_underscored %>(api, <%= model_name_underscored %>)
|
4
|
-
end
|
5
|
-
end
|
1
|
+
api.array :<%= model_name_pluralize_underscored %>, api_meta(total_count: @entity_count, offset: @offset, limit: @limit) do
|
2
|
+
@entities.each do |<%= model_name_underscored %>|
|
3
|
+
render_api_<%= model_name_underscored %>(api, <%= model_name_underscored %>)
|
4
|
+
end
|
5
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
<h1><%%= link_to(@<%= model_name_underscored %>.to_s, @<%= model_name_underscored %>_url) %></h1>
|
1
|
+
<h1><%%= link_to(@<%= model_name_underscored %>.to_s, @<%= model_name_underscored %>_url) %></h1>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<%%= @<%= model_name_underscored %>.to_s %>
|
2
|
-
<%%= @<%= model_name_underscored %>_url %>
|
1
|
+
<%%= @<%= model_name_underscored %>.to_s %>
|
2
|
+
<%%= @<%= model_name_underscored %>_url %>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<%%= @<%= model_name_underscored %>.to_s %>
|
2
|
-
<%%= @<%= model_name_underscored %>_url %>
|
1
|
+
<%%= @<%= model_name_underscored %>.to_s %>
|
2
|
+
<%%= @<%= model_name_underscored %>_url %>
|
@@ -1,13 +1,13 @@
|
|
1
|
-
<% if project? %>
|
2
|
-
resources :projects do
|
3
|
-
resources :<%= model_name_pluralize_underscored %>
|
4
|
-
end
|
5
|
-
<% end %>
|
6
|
-
resources :<%= model_name_pluralize_underscored %> do
|
7
|
-
collection do
|
8
|
-
get 'autocomplete'
|
9
|
-
get 'bulk_edit'
|
10
|
-
post 'bulk_update'
|
11
|
-
get 'context_menu'
|
12
|
-
end
|
1
|
+
<% if project? %>
|
2
|
+
resources :projects do
|
3
|
+
resources :<%= model_name_pluralize_underscored %>
|
4
|
+
end
|
5
|
+
<% end %>
|
6
|
+
resources :<%= model_name_pluralize_underscored %> do
|
7
|
+
collection do
|
8
|
+
get 'autocomplete'
|
9
|
+
get 'bulk_edit'
|
10
|
+
post 'bulk_update'
|
11
|
+
get 'context_menu'
|
12
|
+
end
|
13
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Easy Software Ltd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -146,13 +146,13 @@ files:
|
|
146
146
|
- Rakefile
|
147
147
|
- app/assets/javascripts/redmine_extensions/application.js
|
148
148
|
- app/assets/javascripts/redmine_extensions/blocking.js
|
149
|
+
- app/assets/javascripts/redmine_extensions/blocking_dynamic_loading.js
|
149
150
|
- app/assets/javascripts/redmine_extensions/blocking_module.js
|
150
151
|
- app/assets/javascripts/redmine_extensions/blocking_namespace.js
|
151
152
|
- app/assets/javascripts/redmine_extensions/blocking_polyfill.js
|
152
153
|
- app/assets/javascripts/redmine_extensions/blocking_render.js
|
153
154
|
- app/assets/javascripts/redmine_extensions/blocking_schedule.js
|
154
155
|
- app/assets/javascripts/redmine_extensions/blocking_utils.js
|
155
|
-
- app/assets/javascripts/redmine_extensions/dynamic_loading.js
|
156
156
|
- app/assets/javascripts/redmine_extensions/easy_togglers.js
|
157
157
|
- app/assets/javascripts/redmine_extensions/event_bus.js
|
158
158
|
- app/assets/javascripts/redmine_extensions/jquery.entityarray.js
|
@@ -304,22 +304,22 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
304
304
|
version: '0'
|
305
305
|
requirements: []
|
306
306
|
rubyforge_project:
|
307
|
-
rubygems_version: 2.6.
|
307
|
+
rubygems_version: 2.6.7
|
308
308
|
signing_key:
|
309
309
|
specification_version: 4
|
310
310
|
summary: Redmine Extensions is set of usefull features for Redmine. Main focus is
|
311
311
|
on development helpers, but many users can find it helpfull
|
312
312
|
test_files:
|
313
|
-
- spec/
|
314
|
-
- spec/features/autocomplete_spec.rb
|
315
|
-
- spec/models/easy_setting_spec.rb
|
316
|
-
- spec/presenters/redmine_extensions/easy_setting_presenter_spec.rb
|
317
|
-
- spec/support/plugin_generator.rb
|
313
|
+
- spec/factories/easy_queries.rb
|
318
314
|
- spec/factories/easy_settings.rb
|
315
|
+
- spec/factories/issues.rb
|
319
316
|
- spec/factories/projects.rb
|
320
|
-
- spec/factories/trackers.rb
|
321
317
|
- spec/factories/time_entries.rb
|
322
|
-
- spec/factories/
|
318
|
+
- spec/factories/trackers.rb
|
323
319
|
- spec/factories/users.rb
|
324
|
-
- spec/
|
320
|
+
- spec/features/autocomplete_spec.rb
|
321
|
+
- spec/models/easy_setting_spec.rb
|
322
|
+
- spec/presenters/redmine_extensions/easy_setting_presenter_spec.rb
|
325
323
|
- spec/rails_helper.rb
|
324
|
+
- spec/spec_helper.rb
|
325
|
+
- spec/support/plugin_generator.rb
|
@@ -1,54 +0,0 @@
|
|
1
|
-
EasyGem.dynamic = {
|
2
|
-
_alreadyLoaded: {},
|
3
|
-
/**
|
4
|
-
* Append Javascript <script> tag to page
|
5
|
-
* @example
|
6
|
-
* EasyGem.dynamic.jsTag("/plugin_assets/my_plugin/javascripts/counter.js");
|
7
|
-
* EasyGem.schedule.require(function(counter){
|
8
|
-
* setInterval(counter.count(), 1000);
|
9
|
-
* }, function(){
|
10
|
-
* return window.utils.counter;
|
11
|
-
* })
|
12
|
-
* @param {String} src - absolute path to requested file
|
13
|
-
*/
|
14
|
-
jsTag: function (src) {
|
15
|
-
if (this._alreadyLoaded[src]) return;
|
16
|
-
this._alreadyLoaded[src] = true;
|
17
|
-
var jsScript = document.createElement("script");
|
18
|
-
jsScript.setAttribute("src", src);
|
19
|
-
jsScript.setAttribute("defer", "true");
|
20
|
-
document.head.appendChild(jsScript);
|
21
|
-
},
|
22
|
-
/**
|
23
|
-
* Append CSS <link> tag to page
|
24
|
-
* @param {String} src - absolute path to requested file
|
25
|
-
*/
|
26
|
-
cssTag: function (src) {
|
27
|
-
if (this._alreadyLoaded[src]) return;
|
28
|
-
this._alreadyLoaded[src] = true;
|
29
|
-
var link = document.createElement('link');
|
30
|
-
link.rel = "stylesheet";
|
31
|
-
link.type = "text/css";
|
32
|
-
link.href = src;
|
33
|
-
link.media = "all";
|
34
|
-
document.head.appendChild(link);
|
35
|
-
},
|
36
|
-
/**
|
37
|
-
* Load multiple JS files into page
|
38
|
-
* @param {Array.<String>} array
|
39
|
-
*/
|
40
|
-
jsTags: function (array) {
|
41
|
-
for (var i = 0; i < array.length; i++) {
|
42
|
-
this.jsTag(array[i]);
|
43
|
-
}
|
44
|
-
},
|
45
|
-
/**
|
46
|
-
* Load multiple CSS files into page
|
47
|
-
* @param {Array.<String>} array
|
48
|
-
*/
|
49
|
-
cssTags: function (array) {
|
50
|
-
for (var i = 0; i < array.length; i++) {
|
51
|
-
this.cssTag(array[i]);
|
52
|
-
}
|
53
|
-
}
|
54
|
-
};
|