netzke-core 0.8.3 → 0.8.4
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/CHANGELOG.md +11 -0
- data/Gemfile +1 -0
- data/README.md +9 -3
- data/javascripts/base.js +15 -8
- data/javascripts/ext.js +145 -70
- data/lib/netzke/base.rb +33 -10
- data/lib/netzke/core.rb +1 -0
- data/lib/netzke/core/action_config.rb +3 -3
- data/lib/netzke/core/actions.rb +34 -2
- data/lib/netzke/core/component_config.rb +3 -2
- data/lib/netzke/core/composition.rb +19 -36
- data/lib/netzke/core/configuration.rb +1 -3
- data/lib/netzke/core/dsl_config_base.rb +9 -0
- data/lib/netzke/core/dsl_support.rb +6 -6
- data/lib/netzke/core/javascript.rb +11 -5
- data/lib/netzke/core/railz/controller_extensions.rb +56 -28
- data/lib/netzke/core/services.rb +20 -6
- data/lib/netzke/core/version.rb +1 -1
- data/test/core_test_app/app/components/actions.rb +2 -0
- data/test/core_test_app/app/components/composition.rb +1 -0
- data/test/core_test_app/app/components/dynamic_loading.rb +7 -11
- data/test/core_test_app/app/components/dynamic_loading/javascripts/dynamic_loading.js +1 -1
- data/test/core_test_app/app/components/endpoints.rb +15 -1
- data/test/core_test_app/app/components/endpoints/javascripts/endpoints.js +6 -2
- data/test/core_test_app/app/components/hello_user.rb +12 -0
- data/test/core_test_app/app/components/hello_world/javascripts/hello_world.js +1 -1
- data/test/core_test_app/app/components/multi_instance_loading.rb +18 -0
- data/test/core_test_app/app/components/multi_instance_loading/javascripts/multi_instance_loading.js +18 -0
- data/test/core_test_app/app/components/persistence.rb +1 -1
- data/test/core_test_app/app/components/session_expiration.rb +21 -0
- data/test/core_test_app/app/components/simple_component.rb +1 -1
- data/test/core_test_app/config/initializers/javascripts/session_expiration.js +6 -0
- data/test/core_test_app/config/initializers/netzke.rb +3 -1
- data/test/core_test_app/log/development.log +46574 -0
- data/test/core_test_app/log/test.log +67624 -0
- data/test/core_test_app/tmp/cache/assets/C92/5A0/sprockets%2F39e75754782ee12179bf35c9a0971d80 +0 -0
- data/test/core_test_app/tmp/cache/assets/C9F/750/sprockets%2F20ce3d64040a5d3a0a8883bd60754356 +0 -0
- data/test/core_test_app/tmp/cache/assets/CC4/C00/sprockets%2Fc615df52887d8c2e67e8413576a419c5 +0 -0
- data/test/core_test_app/tmp/cache/assets/D0E/870/sprockets%2Fa593bf4fac106add88c9434141a49663 +0 -0
- data/test/core_test_app/tmp/cache/assets/D14/8E0/sprockets%2F20748e8d1d7d090d122904a9fe6f18fc +0 -0
- data/test/core_test_app/tmp/cache/assets/D3E/DA0/sprockets%2Fa175f1ac5996544b908ba3ba3f64c4f3 +0 -0
- data/test/core_test_app/tmp/cache/assets/D43/C00/sprockets%2F7bc60c758776356d615ab5edff201ee2 +0 -0
- data/test/core_test_app/tmp/cache/assets/D98/9C0/sprockets%2F18b80e8fe200aebc522e561a867ea6fb +0 -0
- data/test/core_test_app/tmp/cache/assets/DB0/6E0/sprockets%2F03e33f5a4779eeb48bcfc86ee717fb55 +0 -0
- metadata +13 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55fca10ef68267045dcd10e37b97ae453c7ec861
|
4
|
+
data.tar.gz: bf701fb44bcb1d3ce8eeb588d605506037c2ad7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8ab0114b06c034a7f2916b529fcfd2d6812573b880676e05de202d8bf5bc8e5feffee6619f21c402cff5415ac12293d39026d2aaa6e178787722d19b06547d8
|
7
|
+
data.tar.gz: 3116eebeb560d37dbadafdc12c2694d6c76c9b58f12015770ddea379621dd26e5308e28a0813f646ff7fb0f9614f96a19024fa6cf87ea77d681249226da80c8c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# v0.8.4 - 2013-05-22
|
2
|
+
* bug fix
|
3
|
+
* Re-enable session expiration detection
|
4
|
+
* Do not crash on a rare situation when an endpoint is being called on an non-existing child component
|
5
|
+
* improvements
|
6
|
+
* Add `serverexception` event on `Netzke.directProvider`, subscribe to it to handle server exceptions
|
7
|
+
* Endpoint calls will now pass Ext.direct.Exception to the provided callback function in case of server exception
|
8
|
+
* A component will clean-up the loading mask when a server exception occurs during dynamic component loading
|
9
|
+
* `netzkeFeedback` now shows multiple messages in a single slide banner
|
10
|
+
* Implement multi-instance child component loading with different configuration (see MultiInstanceLoading in the test app)
|
11
|
+
|
1
12
|
# v0.8.3 - 2013-03-22
|
2
13
|
* support Rails 3.2.13
|
3
14
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -8,7 +8,7 @@ Some knowledge of Sencha Ext JS will be needed in order to fully understand this
|
|
8
8
|
|
9
9
|
## Rationale
|
10
10
|
|
11
|
-
[Sencha Ext JS]("http://www.sencha.com/products/extjs") is a powerful front-end framework, which is used for crafting web-apps that give the end user experience similar to that of a desktop application. It has an extensive set of widgets ('components'), and leverages a modular approach to its fullest: a developer can extend components (using Ext JS's own [class system]("http://docs.sencha.com/ext-js/4-1/#!/guide/class_system")), nest components using many powerful layouts, dynamically create and destroy them. The architecture of Ext JS is well
|
11
|
+
[Sencha Ext JS]("http://www.sencha.com/products/extjs") is a powerful front-end framework, which is used for crafting web-apps that give the end user experience similar to that of a desktop application. It has an extensive set of widgets ('components'), and leverages a modular approach to its fullest: a developer can extend components (using Ext JS's own [class system]("http://docs.sencha.com/ext-js/4-1/#!/guide/class_system")), nest components using many powerful layouts, dynamically create and destroy them. The architecture of Ext JS is well thought out and very complete.
|
12
12
|
|
13
13
|
However, with Ext JS being server-agnostic, it is not always a trivial task for a developer to bind Ext JS components to the server-side data *and* application business logic, especially in complex applications. Netzke as the solution that allows you to extend the modular approach to the server side.
|
14
14
|
|
@@ -25,11 +25,11 @@ Netzke Core takes the burden of implementing the following key aspects of the fr
|
|
25
25
|
|
26
26
|
...and more.
|
27
27
|
|
28
|
-
All this extremely facilitates building fast, low-traffic, robust, and highly maintainable applications. As a result, your code scales much better in the sense of complexity, compared to using conventional MVC, where developers are pretty much limited with programming techniques they can apply.
|
28
|
+
All this extremely facilitates building fast, low-traffic, robust, and highly maintainable applications. As a result, your code scales much better in the sense of complexity, compared to using conventional MVC, where developers are pretty much limited with the programming techniques that they can apply.
|
29
29
|
|
30
30
|
## HelloWorld component
|
31
31
|
|
32
|
-
*This component is distributed as a part of the test application, see `test/core_test_app/components`.*
|
32
|
+
*This component is distributed as a part of the test application, see `test/core_test_app/components/hello_world.rb`.*
|
33
33
|
|
34
34
|
Ext JS files are not distributed with Netzke, so, make sure that they are located in (or sym-linked as) `YOUR_APP/public/extjs`.
|
35
35
|
|
@@ -365,6 +365,12 @@ This assumes that the Ext JS library is located/symlinked in `test/core_test_app
|
|
365
365
|
|
366
366
|
$ EXTJS_SRC=cdn rake
|
367
367
|
|
368
|
+
## Contributions and support
|
369
|
+
|
370
|
+
Help developing Netzke by submitting a pull request when you think others can benefit from it.
|
371
|
+
|
372
|
+
If you feel particularily generous, you can donate a couple of bucks a week at [GitTip](https://www.gittip.com/nomadcoder/).
|
373
|
+
|
368
374
|
## Useful links
|
369
375
|
|
370
376
|
* [Project website](http://netzke.org)
|
data/javascripts/base.js
CHANGED
@@ -47,10 +47,6 @@ Netzke.isLoading=function () {
|
|
47
47
|
// xtypes of cached Netzke classes
|
48
48
|
Netzke.cache = [];
|
49
49
|
|
50
|
-
Netzke.componentNotInSessionHandler = function() {
|
51
|
-
throw "Netzke: component not in Rails session. Define Netzke.componentNotInSessionHandler to handle this.";
|
52
|
-
};
|
53
|
-
|
54
50
|
Ext.define("Netzke.classes.Core.Mixin", {
|
55
51
|
isNetzke: true, // to distinguish Netzke components from regular Ext components
|
56
52
|
|
@@ -111,6 +107,8 @@ Ext.define("Netzke.classes.Core.Mixin", {
|
|
111
107
|
} else {
|
112
108
|
for (var instr in instructions) {
|
113
109
|
var args = instructions[instr];
|
110
|
+
if(args instanceof Object && Ext.isEmpty(args))
|
111
|
+
args = [];
|
114
112
|
|
115
113
|
if (Ext.isFunction(this[instr])) {
|
116
114
|
// Executing the method.
|
@@ -120,7 +118,7 @@ Ext.define("Netzke.classes.Core.Mixin", {
|
|
120
118
|
if (childComponent) {
|
121
119
|
childComponent.netzkeBulkExecute(args);
|
122
120
|
} else if (Ext.isArray(args)) { // only consider those calls that have arguments wrapped in an array; the only (probably) case when they are not, is with 'success' property set to true in a non-ajax form submit - silently ignore that
|
123
|
-
throw "Netzke: Unknown method or child component '" + instr +"' in component '" + this.id + "'"
|
121
|
+
throw "Netzke: Unknown method or child component '" + instr + "' in component '" + this.id + "'"
|
124
122
|
}
|
125
123
|
}
|
126
124
|
}
|
@@ -135,11 +133,20 @@ Ext.define("Netzke.classes.Core.Mixin", {
|
|
135
133
|
},
|
136
134
|
|
137
135
|
/**
|
138
|
-
*
|
136
|
+
* This method gets called by the server when the component to which an endpoint call was directed to, is not in the session anymore.
|
139
137
|
* @private
|
140
138
|
*/
|
141
|
-
|
142
|
-
|
139
|
+
netzkeSessionExpired: function() {
|
140
|
+
this.netzkeSessionIsExpired = true;
|
141
|
+
this.onNetzkeSessionExpired();
|
142
|
+
},
|
143
|
+
|
144
|
+
/**
|
145
|
+
* Override this method to handle session expiration. E.g. you may want to inform the user that they will be redirected to the login page.
|
146
|
+
* @private
|
147
|
+
*/
|
148
|
+
onNetzkeSessionExpired: function() {
|
149
|
+
Netzke.warning("Component not in session. Override `onNetzkeSessionExpired` to handle this.");
|
143
150
|
},
|
144
151
|
|
145
152
|
/**
|
data/javascripts/ext.js
CHANGED
@@ -56,22 +56,37 @@ Ext.define('Netzke.FeedbackGhost', {
|
|
56
56
|
Ext.define('Netzke.classes.NetzkeRemotingProvider', {
|
57
57
|
extend: 'Ext.direct.RemotingProvider',
|
58
58
|
|
59
|
+
initComponent: function() {
|
60
|
+
this.callParent();
|
61
|
+
this.addEvent('serverexception'); // because 'exception' is reserved by Ext JS (but never used!)
|
62
|
+
},
|
63
|
+
|
64
|
+
listeners: {
|
65
|
+
// work-around the fact that 'exception' is never thrown by Ext JS
|
66
|
+
data: function(self, e) {
|
67
|
+
if (Ext.getClass(e) == Ext.direct.ExceptionEvent) {
|
68
|
+
this.fireEvent('serverexception', e);
|
69
|
+
}
|
70
|
+
}
|
71
|
+
},
|
72
|
+
|
59
73
|
getCallData: function(t){
|
60
74
|
return {
|
61
|
-
|
62
|
-
|
75
|
+
path: t.action,
|
76
|
+
endpoint: t.method,
|
63
77
|
data: t.data,
|
64
|
-
type: 'rpc',
|
65
78
|
tid: t.id
|
66
79
|
}
|
67
80
|
},
|
68
81
|
|
69
|
-
|
70
|
-
var cls = this.namespace[
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
82
|
+
addEndpointsForComponent: function(componentPath, endpoints) {
|
83
|
+
var cls = this.namespace[componentPath] || (this.namespace[componentPath] = {});
|
84
|
+
|
85
|
+
Ext.Array.each(endpoints, function(ep) {
|
86
|
+
var methodName = ep.camelize(true),
|
87
|
+
method = Ext.create('Ext.direct.RemotingMethod', {name: methodName, len: 1, blah: 666});
|
88
|
+
cls[methodName] = this.createHandler(componentPath, method);
|
89
|
+
}, this);
|
75
90
|
},
|
76
91
|
|
77
92
|
// HACK: Ext JS 4.0.0 retry mechanism is broken
|
@@ -84,11 +99,25 @@ Ext.define('Netzke.classes.NetzkeRemotingProvider', {
|
|
84
99
|
}
|
85
100
|
});
|
86
101
|
|
102
|
+
Netzke.directProvider = new Netzke.classes.NetzkeRemotingProvider({
|
103
|
+
type: "remoting", // create a Ext.direct.RemotingProvider
|
104
|
+
url: Netzke.ControllerUrl + "direct/", // url to connect to the Ext.Direct server-side router.
|
105
|
+
namespace: "Netzke.providers", // Netzke.providers will have a key per Netzke component, each mapped to a hash with a RemotingMethod per endpoint
|
106
|
+
actions: {},
|
107
|
+
maxRetries: Netzke.core.directMaxRetries,
|
108
|
+
enableBuffer: true, // buffer/batch requests within 10ms timeframe
|
109
|
+
timeout: 30000 // 30s timeout per request
|
110
|
+
});
|
111
|
+
|
112
|
+
Ext.Direct.addProvider(Netzke.directProvider);
|
113
|
+
|
87
114
|
// Override Ext.Component's constructor to enable Netzke features
|
88
115
|
Ext.define(null, {
|
89
116
|
override: 'Ext.Component',
|
90
117
|
constructor: function(config) {
|
91
118
|
if (this.isNetzke) {
|
119
|
+
// component loading index
|
120
|
+
this.netzkeLoadingIndex = 0;
|
92
121
|
|
93
122
|
this.netzkeComponents = config.netzkeComponents;
|
94
123
|
this.passedConfig = config;
|
@@ -116,18 +145,6 @@ Ext.define(null, {
|
|
116
145
|
}
|
117
146
|
});
|
118
147
|
|
119
|
-
Netzke.directProvider = new Netzke.classes.NetzkeRemotingProvider({
|
120
|
-
type: "remoting", // create a Ext.direct.RemotingProvider
|
121
|
-
url: Netzke.ControllerUrl + "direct/", // url to connect to the Ext.Direct server-side router.
|
122
|
-
namespace: "Netzke.providers", // namespace to create the Remoting Provider in
|
123
|
-
actions: {},
|
124
|
-
maxRetries: Netzke.core.directMaxRetries,
|
125
|
-
enableBuffer: true, // buffer/batch requests within 10ms timeframe
|
126
|
-
timeout: 30000 // 30s timeout per request
|
127
|
-
});
|
128
|
-
|
129
|
-
Ext.Direct.addProvider(Netzke.directProvider);
|
130
|
-
|
131
148
|
// Methods/properties that each and every Netzke component will have
|
132
149
|
Ext.define(null, {
|
133
150
|
override: 'Netzke.classes.Core.Mixin',
|
@@ -159,34 +176,70 @@ Ext.define(null, {
|
|
159
176
|
netzkeProcessEndpoints: function(config){
|
160
177
|
var endpoints = config.endpoints || [];
|
161
178
|
endpoints.push('deliver_component'); // all Netzke components get this endpoint
|
162
|
-
|
179
|
+
|
180
|
+
Netzke.directProvider.addEndpointsForComponent(config.path, endpoints);
|
181
|
+
|
163
182
|
var that = this;
|
164
183
|
|
165
|
-
Ext.each(endpoints, function(
|
166
|
-
|
167
|
-
|
184
|
+
Ext.each(endpoints, function(ep){
|
185
|
+
var methodName = ep.camelize(true);
|
186
|
+
|
187
|
+
/* add endpoint method to `this` */
|
188
|
+
this[methodName] = function(args, callback, scope) {
|
168
189
|
Netzke.runningRequests++;
|
169
190
|
|
170
191
|
scope = scope || that;
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
192
|
+
|
193
|
+
var cfgs = this.buildParentClientConfigs();
|
194
|
+
var remotingArgs = {args: args, configs: cfgs};
|
195
|
+
|
196
|
+
Netzke.providers[config.path][methodName].call(scope, remotingArgs, function(result, e) {
|
197
|
+
var callbackParam = e;
|
198
|
+
|
199
|
+
if (Ext.getClass(e) == Ext.direct.RemotingEvent) { // means we didn't get an exception
|
200
|
+
that.netzkeBulkExecute(result); // invoke the endpoint result on the calling component
|
201
|
+
callbackParam = that.latestResult;
|
175
202
|
}
|
176
|
-
|
177
|
-
if(typeof callback == "function") {
|
178
|
-
callback.call(scope,
|
203
|
+
|
204
|
+
if (typeof callback == "function" && !scope.netzkeSessionIsExpired) {
|
205
|
+
callback.call(scope, callbackParam); // invoke the callback on the provided scope, or on the calling component if no scope set. Pass latestResult to callback in case of success, or the Ext.direct.ExceptionEvent otherwise
|
179
206
|
}
|
207
|
+
|
180
208
|
Netzke.runningRequests--;
|
181
209
|
});
|
182
210
|
}
|
183
211
|
}, this);
|
184
212
|
|
185
|
-
Netzke.directProvider.addAction(config.id, directActions);
|
186
|
-
|
187
213
|
delete config.endpoints;
|
188
214
|
},
|
189
215
|
|
216
|
+
/**
|
217
|
+
* Array of client configs for each parent down the tree
|
218
|
+
* @private
|
219
|
+
*/
|
220
|
+
buildParentClientConfigs: function() {
|
221
|
+
if (!this._parentClientConfig) {
|
222
|
+
this._parentClientConfig = [];
|
223
|
+
var parent = this;
|
224
|
+
while (parent) {
|
225
|
+
var cfg = parent.clientConfig || {};
|
226
|
+
cfg.id = parent.id;
|
227
|
+
this._parentClientConfig.unshift(cfg);
|
228
|
+
parent = parent.netzkeGetParentComponent();
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
return this._parentClientConfig;
|
233
|
+
},
|
234
|
+
|
235
|
+
/**
|
236
|
+
* @private
|
237
|
+
* Handles endpoint exceptions. Ext.direct.ExceptionEvent gets passed as parameter. Override to handle server side exceptions.
|
238
|
+
*/
|
239
|
+
onDirectException: function(e) {
|
240
|
+
Netzke.warning("Server error. Override onDirectException to handle this.");
|
241
|
+
},
|
242
|
+
|
190
243
|
/**
|
191
244
|
* @private
|
192
245
|
*/
|
@@ -232,6 +285,7 @@ Ext.define(null, {
|
|
232
285
|
* @param {Object} config Can contain the following keys:
|
233
286
|
* 'container' - if specified, the instance (or id) of a panel with the 'fit' layout where the loaded component will be added to; the previously existing component will be destroyed
|
234
287
|
* 'append' - if set to +true+, do not clear the container before adding the loaded component
|
288
|
+
* 'clone' - if set to +true+, allows loading multiple instances of the same child component
|
235
289
|
* 'callback' - function that gets called after the component is loaded; it receives the component's instance as parameter
|
236
290
|
* 'configOnly' - if set to +true+, do not instantiate the component, instead pass its config to the callback function
|
237
291
|
* 'params' - object passed to the endpoint, may be useful for extra configuration
|
@@ -254,6 +308,7 @@ Ext.define(null, {
|
|
254
308
|
netzkeLoadComponent: function(){
|
255
309
|
var params;
|
256
310
|
|
311
|
+
// support 2 different signatures
|
257
312
|
if (Ext.isString(arguments[0])) {
|
258
313
|
params = arguments[1] || {};
|
259
314
|
params.name = arguments[0];
|
@@ -264,14 +319,26 @@ Ext.define(null, {
|
|
264
319
|
if (params.container == undefined) params.container = this;
|
265
320
|
params.name = params.name.underscore();
|
266
321
|
|
267
|
-
|
322
|
+
/* params that will be provided for the server API call (deliver_component); all what's passed in params.params is
|
323
|
+
* merged in. This way we exclude from sending along such things as :scope and :callback */
|
268
324
|
var serverParams = params.params || {};
|
269
|
-
serverParams
|
325
|
+
serverParams["name"] = params.name;
|
326
|
+
serverParams["client_config"] = params.clientConfig;
|
327
|
+
|
328
|
+
// by which the loaded component will be referred in +netzkeComponentDelivered+
|
329
|
+
var itemId = params.name;
|
330
|
+
|
331
|
+
// multi-instance loading
|
332
|
+
if (params.clone) {
|
333
|
+
serverParams["index"] = this.netzkeLoadingIndex;
|
334
|
+
itemId += this.netzkeLoadingIndex; // << index
|
335
|
+
this.netzkeLoadingIndex++;
|
336
|
+
}
|
270
337
|
|
271
338
|
// coma-separated list of xtypes of already loaded classes
|
272
|
-
serverParams
|
339
|
+
serverParams["cache"] = Netzke.cache.join();
|
273
340
|
|
274
|
-
var storedConfig = this.componentsBeingLoaded[
|
341
|
+
var storedConfig = this.componentsBeingLoaded[itemId] = params;
|
275
342
|
|
276
343
|
// Remember where the loaded component should be inserted into
|
277
344
|
var containerCmp = params.container && Ext.isString(params.container) ? Ext.getCmp(params.container) : params.container;
|
@@ -284,8 +351,12 @@ Ext.define(null, {
|
|
284
351
|
storedConfig.loadMaskCmp.show();
|
285
352
|
}
|
286
353
|
|
287
|
-
//
|
288
|
-
this.deliverComponent(serverParams)
|
354
|
+
// Call the endpoint
|
355
|
+
this.deliverComponent(serverParams, function(e) {
|
356
|
+
if (Ext.getClass(e) == Ext.direct.ExceptionEvent) {
|
357
|
+
this.netzkeUndoLoadingComponent(params.name);
|
358
|
+
}
|
359
|
+
}, this);
|
289
360
|
},
|
290
361
|
|
291
362
|
/**
|
@@ -293,15 +364,8 @@ Ext.define(null, {
|
|
293
364
|
* @private
|
294
365
|
*/
|
295
366
|
netzkeComponentDelivered: function(config){
|
296
|
-
|
297
|
-
|
298
|
-
var callbackParam;
|
299
|
-
delete this.componentsBeingLoaded[config.name];
|
300
|
-
|
301
|
-
if (storedConfig.loadMaskCmp) {
|
302
|
-
storedConfig.loadMaskCmp.hide();
|
303
|
-
storedConfig.loadMaskCmp.destroy();
|
304
|
-
}
|
367
|
+
var storedConfig = this.netzkeUndoLoadingComponent(config.itemId),
|
368
|
+
callbackParam;
|
305
369
|
|
306
370
|
if (storedConfig.configOnly) {
|
307
371
|
callbackParam = config;
|
@@ -329,12 +393,28 @@ Ext.define(null, {
|
|
329
393
|
}
|
330
394
|
},
|
331
395
|
|
396
|
+
/**
|
397
|
+
* Destroys the loading mask and removes the component from componentsBeingLoaded
|
398
|
+
* @private
|
399
|
+
*/
|
400
|
+
netzkeUndoLoadingComponent: function(itemId) {
|
401
|
+
var storedConfig = this.componentsBeingLoaded[itemId] || {};
|
402
|
+
delete this.componentsBeingLoaded[itemId];
|
403
|
+
|
404
|
+
if (storedConfig.loadMaskCmp) {
|
405
|
+
storedConfig.loadMaskCmp.hide();
|
406
|
+
storedConfig.loadMaskCmp.destroy();
|
407
|
+
}
|
408
|
+
|
409
|
+
return storedConfig;
|
410
|
+
},
|
411
|
+
|
332
412
|
/**
|
333
413
|
* @private
|
334
414
|
*/
|
335
415
|
netzkeComponentDeliveryFailed: function(params) {
|
336
|
-
var storedConfig = this.componentsBeingLoaded[params.
|
337
|
-
delete this.componentsBeingLoaded[params.
|
416
|
+
var storedConfig = this.componentsBeingLoaded[params.itemId] || {};
|
417
|
+
delete this.componentsBeingLoaded[params.itemId];
|
338
418
|
|
339
419
|
if (storedConfig.loadMaskCmp) {
|
340
420
|
storedConfig.loadMaskCmp.hide();
|
@@ -377,7 +457,8 @@ Ext.define(null, {
|
|
377
457
|
*/
|
378
458
|
netzkeInstantiateComponent: function(name) {
|
379
459
|
name = name.camelize(true);
|
380
|
-
|
460
|
+
var cfg = this.netzkeComponents[name];
|
461
|
+
return Ext.createByAlias(this.netzkeComponents[name].alias, cfg)
|
381
462
|
},
|
382
463
|
|
383
464
|
/**
|
@@ -399,27 +480,23 @@ Ext.define(null, {
|
|
399
480
|
|
400
481
|
/**
|
401
482
|
* Provides a visual feedback. TODO: refactor
|
483
|
+
* msg can be a string, an array of strings, an object in form {msg: 'Message'}, or an array of such objects.
|
402
484
|
*/
|
403
485
|
netzkeFeedback: function(msg, options){
|
404
486
|
if (this.initialConfig && this.initialConfig.quiet) return false;
|
405
487
|
|
406
488
|
options = options || {};
|
407
489
|
|
408
|
-
if (
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
});
|
419
|
-
if (compoundResponse != "") {
|
420
|
-
alert(compoundResponse);
|
421
|
-
}
|
422
|
-
}
|
490
|
+
if (typeof msg == 'string'){ msg = [msg]; }
|
491
|
+
|
492
|
+
var feedback = "";
|
493
|
+
|
494
|
+
Ext.each(msg, function(m){
|
495
|
+
feedback += m.msg || m + "<br/>"
|
496
|
+
});
|
497
|
+
|
498
|
+
if (feedback != "") {
|
499
|
+
this.feedbackGhost.showFeedback(feedback, {delay: options.delay});
|
423
500
|
}
|
424
501
|
},
|
425
502
|
|
@@ -465,7 +542,5 @@ Ext.define(null, {
|
|
465
542
|
}, this);
|
466
543
|
delete config.netzkePlugins;
|
467
544
|
}
|
468
|
-
}
|
469
|
-
|
470
|
-
// netzkeOnComponentLoad: Ext.emptyFn // gets overridden
|
545
|
+
}
|
471
546
|
});
|