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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee45cc8ecef4a8702670c2992e3599fdb96682dd
4
- data.tar.gz: ffd40d9a0183a752fc463c8f7be2ae4aec17ddf7
3
+ metadata.gz: 4b6908fe3fa7949e58a19003cbc84109a5aa1d99
4
+ data.tar.gz: ef57c4be4e0d348483a6f44d3d31920fbb22f0c4
5
5
  SHA512:
6
- metadata.gz: 3561ac257b97d0eb8a69a1cf5b7a7c185e852e0dc40db32f6d192a2e82ebe8336f44e741d2963d18602c37b43bebd343caa90afb804f54a66dad60321fa1cb89
7
- data.tar.gz: fae10df3d70b5b551fa62bdf4289ff09490eba0cc3aa6423307923e49674e8fa5580e431419408c2ba706681ac783c003293ad3c56323f49f34e6d0254898615
6
+ metadata.gz: 0fbc838412a96e26c5c068af3c641404bdd11bb87237935826c8ffe33ebdae4b758d76ffa60b61f4670888a43bcc8b63267c87a45370e3c70a57d56241bfd8b7
7
+ data.tar.gz: be933bea060cdb21c914b7e8d91504f8442426ec2b3ecf2923165f271e80b8d6c84446ada363068d23c01a5269d86ebf8d8e65cfb8c95b360eda42796ced39c5
@@ -13,5 +13,4 @@
13
13
  //= require ./easy_togglers
14
14
  //= require ./jquery.entityarray
15
15
  //= require ./render_polyfill
16
- //= require ./dynamic_loading
17
16
  //= require ./redmine_extensions
@@ -4,7 +4,8 @@
4
4
  //= require ./blocking_namespace
5
5
  // require ./event_bus
6
6
  //= require ./blocking_schedule
7
- // require ./blocking_module
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 modules = {};
6
- var waiters = {};
7
- var modulesOrdered = {};
8
-
9
- window.EASY = window.EASY || {};
10
- EASY.modules = {};
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.<Module>} dependencies
19
+ * @property {Array.<String>} dependencies
20
+ * @property {Array.<Waiter>} waiters
37
21
  * @constructor
38
22
  */
39
- function Module(moduleName, dependencies, factory) {
23
+ function EasyModule(moduleName) {
40
24
  this.name = moduleName;
41
- this.dependencies = dependencies;
42
- this.factory = factory;
43
- if (modulesOrdered[moduleName]) {
44
- this.construct();
45
- }
25
+ setTimeout(function () {
26
+ executeWaiters();
27
+ }, 0);
46
28
  }
47
29
 
48
- Module.prototype.instance = null;
49
- Module.prototype.factory = function () {
50
- return {};
51
- };
52
- Module.prototype.name = "unnamed";
53
- Module.prototype.dependencies = [];
54
- Module.prototype.construct = function (visited) {
55
- var dependencyInstances;
56
- visited = visited || [];
57
- if(visited.indexOf(this.name)>-1){
58
- throw "Cyclic dependency: " + this.name + " -> " + visited[visited.length - 1] + " -> " + this.name;
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
- if (this.dependencies) {
62
- dependencyInstances = [];
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
- this.instance = this.factory(dependencyInstances);
75
- if (this.instance) {
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
- var getDependencies = function (dependencyNames) {
86
- var dependencyInstances = [];
87
- for (var i = 0; i < dependencyNames.length; i++) {
88
- var dependencyName = dependencyNames[i];
89
- var dependency = modules[dependencyName];
90
- if (!dependency) return null;
91
- if (!dependency.instance) {
92
- dependency.construct();
93
- }
94
- if (!dependency.instance) {
95
- return null;
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
- if (!waiters[missingModule]) {
116
- waiters[missingModule] = [];
88
+ function loadModule(moduleName) {
89
+ var url = urls[moduleName];
90
+ if (url) {
91
+ EasyGem.dynamic.jsTag(url);
117
92
  }
118
- waiters[missingModule].push(pack);
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
- * Module constructor. Execute [factory] only if [moduleName] is registered
126
- * Works also, if EASY.registerModule is called after module definition
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
- EASY.modules.module = function easyModule(moduleName, dependencies, factory) {
132
- modules[moduleName] = new Module(moduleName, dependencies, factory);
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
- * @param {String} moduleName
136
- * @param {Function} getter
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
- EASY.modules.toModule = function (moduleName, getter) {
139
- modules[moduleName] = new Module(moduleName, null, getter);
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
- * @param {Array.<String>} dependencies
143
- * @param {Function} body
144
- * @param {Object} [context]
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
- EASY.modules.require = function (dependencies, body, context) {
147
- if (!dependencies || dependencies.length === 0) body.call(context || window);
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
- if (executeOnePrerequisite(prerequisiteArray[i])) {
89
+ var pack = prerequisiteArray[i];
90
+ if (!pack) {
90
91
  count++;
91
- prerequisiteArray[i] = null;
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 {{out: boolean, late: EASY.schedule.late, require: EASY.schedule.require, main: EASY.schedule.main, define: EASY.schedule.define}}
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 pack = {func: func, pres: pres};
191
- if (!executeOnePrerequisite(pack)) {
192
- prerequisiteArray.push(pack);
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
- pack = {func: func, pre: prerequisite};
199
- if (!executeOnePrerequisite(pack)) {
200
- prerequisiteArray.push(pack);
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
- moduleGetters[name.toLowerCase()] = getter;
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
@@ -1,3 +1,3 @@
1
1
  module RedmineExtensions
2
- VERSION = '0.2.10'
2
+ VERSION = '0.2.11'
3
3
  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.10
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-04-18 00:00:00.000000000 Z
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.12
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/spec_helper.rb
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/easy_queries.rb
318
+ - spec/factories/trackers.rb
323
319
  - spec/factories/users.rb
324
- - spec/factories/issues.rb
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
- };