extjs-mvc 0.4.0.f → 0.4.0.g

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.
Files changed (86) hide show
  1. data/Rakefile +2 -2
  2. data/VERSION +1 -1
  3. data/bin/extjs-mvc +0 -3
  4. data/lib/extjs-mvc.rb +10 -6
  5. data/lib/extjs-mvc/api.rb +0 -1
  6. metadata +8 -84
  7. data/lib/src/App.js +0 -219
  8. data/lib/src/MVC.js +0 -260
  9. data/lib/src/Presenter.js +0 -52
  10. data/lib/src/README.rdoc +0 -69
  11. data/lib/src/controller/Controller.js +0 -278
  12. data/lib/src/controller/CrudController.js +0 -460
  13. data/lib/src/lib/Array.js +0 -26
  14. data/lib/src/lib/Booter.js +0 -416
  15. data/lib/src/lib/ClassManager.js +0 -191
  16. data/lib/src/lib/ControllerClassManager.js +0 -95
  17. data/lib/src/lib/Dependencies.js +0 -44
  18. data/lib/src/lib/DispatchMatcher.js +0 -98
  19. data/lib/src/lib/Dispatcher.js +0 -129
  20. data/lib/src/lib/Environment.js +0 -43
  21. data/lib/src/lib/Inflector.js +0 -155
  22. data/lib/src/lib/ModelClassManager.js +0 -19
  23. data/lib/src/lib/Route.js +0 -139
  24. data/lib/src/lib/Router.js +0 -282
  25. data/lib/src/lib/String.js +0 -94
  26. data/lib/src/lib/ViewClassManager.js +0 -229
  27. data/lib/src/lib/notes.txt +0 -32
  28. data/lib/src/model/AdapterManager.js +0 -30
  29. data/lib/src/model/Association.js +0 -26
  30. data/lib/src/model/Base.js +0 -63
  31. data/lib/src/model/BelongsToAssociation.js +0 -116
  32. data/lib/src/model/Cache.js +0 -131
  33. data/lib/src/model/HasManyAssociation.js +0 -160
  34. data/lib/src/model/Model.js +0 -331
  35. data/lib/src/model/UrlBuilder.js +0 -106
  36. data/lib/src/model/adapters/AbstractAdapter.js +0 -296
  37. data/lib/src/model/adapters/MemoryAdapter.js +0 -103
  38. data/lib/src/model/adapters/RESTAdapter.js +0 -345
  39. data/lib/src/model/adapters/RESTJSONAdapter.js +0 -68
  40. data/lib/src/model/adapters/notes.txt +0 -42
  41. data/lib/src/model/associations/Association.js +0 -192
  42. data/lib/src/model/associations/notes.txt +0 -87
  43. data/lib/src/model/validations/Errors.js +0 -136
  44. data/lib/src/model/validations/Plugin.js +0 -139
  45. data/lib/src/model/validations/Validations.js +0 -276
  46. data/lib/src/notes/Charts.graffle +0 -0
  47. data/lib/src/overrides/Ext.Component.js +0 -21
  48. data/lib/src/overrides/Ext.extend.js +0 -142
  49. data/lib/src/spec/Array.spec.js +0 -15
  50. data/lib/src/spec/ExtMVC.spec.js +0 -65
  51. data/lib/src/spec/Model.spec.js +0 -370
  52. data/lib/src/spec/OS.spec.js +0 -83
  53. data/lib/src/spec/Router.spec.js +0 -99
  54. data/lib/src/spec/SpecHelper.js +0 -106
  55. data/lib/src/spec/String.spec.js +0 -83
  56. data/lib/src/spec/model/AbstractAdapter.spec.js +0 -49
  57. data/lib/src/spec/model/Associations.spec.js +0 -99
  58. data/lib/src/spec/model/Cache.spec.js +0 -5
  59. data/lib/src/spec/model/RESTAdapter.spec.js +0 -19
  60. data/lib/src/spec/model/ValidationErrors.spec.js +0 -64
  61. data/lib/src/spec/model/Validations.spec.js +0 -166
  62. data/lib/src/spec/model/ValidationsPlugin.spec.js +0 -108
  63. data/lib/src/spec/suite.html +0 -60
  64. data/lib/src/specs-old/JSSpec.css +0 -216
  65. data/lib/src/specs-old/JSSpec.js +0 -1512
  66. data/lib/src/specs-old/all.html +0 -66
  67. data/lib/src/specs-old/base.js +0 -14
  68. data/lib/src/specs-old/controller.js +0 -17
  69. data/lib/src/specs-old/diff_match_patch.js +0 -1
  70. data/lib/src/specs-old/model.js +0 -70
  71. data/lib/src/specs-old/route.js +0 -38
  72. data/lib/src/specs-old/router.js +0 -59
  73. data/lib/src/specs-old/string.js +0 -22
  74. data/lib/src/testrunner/JSpecFormatter.js +0 -111
  75. data/lib/src/testrunner/TestClient.js +0 -181
  76. data/lib/src/testrunner/TestGrid.js +0 -351
  77. data/lib/src/testrunner/TestRunner.js +0 -110
  78. data/lib/src/testrunner/TestViewport.js +0 -94
  79. data/lib/src/vendor.yml +0 -29
  80. data/lib/src/vendor/ext-3.1.1/vendor.yml +0 -16
  81. data/lib/src/view/FormWindow.js +0 -184
  82. data/lib/src/view/HasManyEditorGridPanel.js +0 -211
  83. data/lib/src/view/scaffold/Edit.js +0 -46
  84. data/lib/src/view/scaffold/Index.js +0 -561
  85. data/lib/src/view/scaffold/New.js +0 -20
  86. data/lib/src/view/scaffold/ScaffoldFormPanel.js +0 -255
@@ -1,345 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.plugin.adapter.RESTAdapter
3
- * @extends ExtMVC.model.plugin.adapter.Abstract
4
- * An adapter which hooks into a RESTful server side API for its data storage. This is the recommended
5
- * adapter to use on MVC applications.
6
- * <h2>Usage</h2>
7
- * Say we have a User model defined:
8
- <pre><code>
9
- ExtMVC.model.define("User", {
10
- fields: [{name: 'id', type: 'int'}, {name: 'name', type: 'string'}]
11
- });
12
- var user = new User({id: 1, name: 'Saul Tigh'});
13
- </code></pre>
14
- * If this model uses the REST Adapter, the following methods are made available to it. Each fires the AJAX request
15
- * indicated in the comment next to it:
16
- <pre><code>
17
- user.destroy(); //DELETE /users/1
18
- user.save(); //PUT /users/1 with {id: 1, name: 'Saul Tigh'} as the request payload
19
- user.update({name: 'Bill Adama'})l //PUT /users/1/ with {id: 1, name: 'Bill Adama'} as the request payload
20
- </code></pre>
21
- * In addition, the following methods are made available to the User class object:
22
- <pre><code>
23
- User.destroy(10); //DELETE /users/1
24
-
25
- User.find(10, {
26
- success: function(instance) {
27
- console.log("Asyncronously loaded User 10 from /users/10 using GET")
28
- },
29
- failure: function() {
30
- console.log('Called if user 10 could not be found');
31
- }
32
- }); //GET /users/10
33
-
34
- User.create({name: 'Gaius Baltar'}, {
35
- success: function(instance) {
36
- console.log('Gaius was created');
37
- },
38
- failure: function(errors) {
39
- console.log('Called if Gaius could not be created');
40
- console.log(errors);
41
- }
42
- }); //POST /users
43
-
44
- User.build({name: 'Felix Gaeta'}); //same as new User({name: 'Felix Gaeta'});
45
- </code></pre>
46
- */
47
- ExtMVC.model.plugin.adapter.RESTAdapter = Ext.extend(ExtMVC.model.plugin.adapter.Abstract, {
48
-
49
- /**
50
- * @property createMethod
51
- * @type String
52
- * The HTTP verb to use when creating a new instance (defaults to 'POST')
53
- */
54
- createMethod: 'POST',
55
-
56
- /**
57
- * @property readMethod
58
- * @type String
59
- * The HTTP verb to use when reading data from the server (e.g. in find requests). Defaults to 'GET'
60
- */
61
- readMethod: 'GET',
62
-
63
- /**
64
- * @property updateMethod
65
- * @type String
66
- * The HTTP verb to use when updating an existing instance (defaults to 'PUT')
67
- */
68
- updateMethod: 'PUT',
69
-
70
- /**
71
- * @property destroyMethod
72
- * @type String
73
- * The HTTP verb to use when destroying an instance (defaults to 'DELETE')
74
- */
75
- destroyMethod: 'DELETE',
76
-
77
- /**
78
- * @property proxyType
79
- * @type Function
80
- * The type of Data Proxy to use (defaults to Ext.data.HttpProxy)
81
- */
82
- proxyType: Ext.data.HttpProxy,
83
-
84
- /**
85
- * Performs the actual save request. Uses POST for new records, PUT when updating existing ones
86
- */
87
- doSave: function(instance, options) {
88
- if (typeof instance == 'undefined') throw new Error('No instance provided to REST Adapter save');
89
- options = options || {};
90
-
91
- var successFn = options.success || Ext.emptyFn,
92
- failureFn = options.failure || Ext.emptyFn;
93
-
94
- delete options.success; delete options.failure;
95
-
96
- Ext.Ajax.request(
97
- Ext.apply({
98
- url : this.instanceUrl(instance),
99
- method : instance.newRecord() ? this.createMethod : this.updateMethod,
100
- params : this.buildPostData(instance),
101
-
102
- success: function(instance, userCallback, scope) {
103
- var scope = scope || this;
104
-
105
- return function(response, options) {
106
- var jsonPath = instance.modelName.underscore(),
107
- jsonData = Ext.decode(response.responseText)[jsonPath];
108
-
109
- for (var key in jsonData) {
110
- instance.set(key, jsonData[key]);
111
- }
112
-
113
- userCallback.call(scope, instance);
114
- };
115
- }(instance, successFn, options.scope),
116
-
117
- failure: function(instance, userCallback, scope) {
118
- var scope = options.scope || this;
119
-
120
- return function(response, options) {
121
- failureFn.call(scope, instance);
122
- };
123
- }(instance, failureFn, options.scope)
124
- }, options)
125
- );
126
- },
127
-
128
- /**
129
- * Callback for save AJAX request. By default this reads server response data and populates the instance
130
- * if the request was successful, adds errors if not
131
- * @private
132
- */
133
- afterSave: function() {
134
-
135
- },
136
-
137
- /**
138
- * Performs the actual find request.
139
- * @private
140
- * @param {Object} conditions An object containing find conditions. If a primaryKey is set this will be used
141
- * to build the url for that particular instance, otherwise the collection url will be used
142
- * @param {Object} options Callbacks (use callback, success and failure)
143
- */
144
- doFind: function(conditions, options, constructor) {
145
- conditions = conditions || {}; options = options || {};
146
-
147
- //if primary key is given, perform a single search
148
- var single = (conditions.primaryKey !== undefined),
149
- url = options.url || this.findUrl(conditions, constructor);
150
-
151
- Ext.applyIf(options, {
152
- conditions: conditions,
153
- scope : this
154
- });
155
-
156
- var findMethod = single ? this.doSingleFind : this.doCollectionFind;
157
- return findMethod.call(this, url, options, constructor);
158
- },
159
-
160
- /**
161
- * Performs an HTTP DELETE request using Ext.Ajax.request
162
- * @private
163
- * @param {ExtMVC.model.Base} instance The model instance to destroy
164
- * @param {Object} options Options object passed to Ext.Ajax.request
165
- * @return {Number} The Ajax transaction ID
166
- */
167
- doDestroy: function(instance, options, constructor) {
168
- var options = options || {};
169
-
170
- if (typeof instance == 'undefined') throw new Error('No instance provided to REST Adapter destroy');
171
-
172
- if (!(instance instanceof Ext.data.Record)) {
173
- var id = parseInt(instance, 10);
174
-
175
- instance = new constructor();
176
- instance.set(constructor.prototype.primaryKey, id);
177
- }
178
-
179
- //if we were passed a success function, save it here so that we can call it with the instance later
180
- var successFn = options.success || Ext.emptyFn;
181
- delete options.success;
182
-
183
- return Ext.Ajax.request(
184
- Ext.applyIf(options, {
185
- method: this.destroyMethod,
186
- url: this.instanceUrl(instance),
187
- success: function() {
188
- successFn.call(options.scope || this, instance);
189
- }
190
- })
191
- );
192
- },
193
-
194
- /**
195
- * Loads a single instance of a model via an Ext.Ajax.request
196
- * @private
197
- * @param {String} url The url to load from
198
- * @param {Object} options Options passed to Ext.Ajax.request
199
- * @param {Function} constructor The constructor function used to instantiate the model instance
200
- * @return {Number} The transaction ID of the Ext.Ajax.request
201
- */
202
- doSingleFind: function(url, options, constructor) {
203
- //store references to user callbacks as we need to overwrite them in the request
204
- var optionsCallback = options.callback,
205
- successCallback = options.success,
206
- failureCallback = options.failure;
207
-
208
- delete options.callback; delete options.success; delete options.failure;
209
-
210
- //need to make a local reference here as scope inside the Ext.data.Request block may not be 'this'
211
- var decodeFunction = this.decodeSingleLoadResponse;
212
-
213
- //helper function to cut down repetition in Ajax request callback
214
- var callIf = function(callback, args) {
215
- if (typeof callback == 'function') callback.apply(options.scope, args);
216
- };
217
-
218
- Ext.Ajax.request(
219
- Ext.apply(options, {
220
- callback: function(opts, success, response) {
221
- if (success === true) {
222
- var instance = new constructor(decodeFunction(response.responseText, constructor));
223
-
224
- callIf(successCallback, [instance, opts, response]);
225
- } else callIf(failureCallback, arguments);
226
-
227
- //call the generic callback passed into options
228
- callIf(optionsCallback, arguments);
229
- }
230
- }, this.buildProxyConfig(url))
231
- );
232
- },
233
-
234
- /**
235
- * @property storeConfig
236
- * @type Object
237
- * Default properties assigned to the Ext.data.Store used in find requests
238
- */
239
- storeConfig: {
240
- autoLoad : true,
241
- remoteSort: false
242
- },
243
-
244
- /**
245
- * Specialised find for dealing with collections. Returns an Ext.data.Store
246
- * @private
247
- * @param {String} url The url to load the collection from
248
- * @param {Object} options Options passed to the Store constructor
249
- * @param {Function} constructor The constructor function used to instantiate the model instance
250
- * @return {Ext.data.Store} A Store with the appropriate configuration to load this collection
251
- */
252
- doCollectionFind: function(url, options, constructor) {
253
- Ext.applyIf(options, this.storeConfig);
254
-
255
- if (options.conditions != undefined) {
256
- Ext.applyIf(options, {
257
- baseParams: options.conditions
258
- });
259
- }
260
-
261
- return new Ext.data.Store(
262
- Ext.applyIf(options, {
263
- reader : constructor.prototype.getReader(),
264
- proxy : new this.proxyType(this.buildProxyConfig(url))
265
- })
266
- );
267
- },
268
-
269
- /**
270
- * Calculates the unique REST URL for a given model instance
271
- * @param {ExtMVC.model.Base} instance The model instance
272
- * @return {String} The url associated with this instance
273
- */
274
- instanceUrl: function(instance) {
275
- if (instance.newRecord()) {
276
- return String.format("/{0}", instance.tableName);
277
- } else {
278
- return String.format("/{0}/{1}", instance.tableName, instance.get(instance.primaryKey));
279
- }
280
- },
281
-
282
- /**
283
- * Calculates the REST URL for a given model collection. By default this just returns / followed by the table name
284
- * @param {Function} constructor The model constructor function
285
- */
286
- collectionUrl: function(constructor) {
287
- return String.format("/{0}", constructor.prototype.tableName);
288
- },
289
-
290
- /**
291
- * Returns configuration data to be used by the DataProxy when loading records. Override to provide your own config
292
- * @param {String} url The url the proxy should use. This is typically calculated elsewhere so must be provided
293
- * @return {Object} Configuration for the proxy
294
- */
295
- buildProxyConfig: function(url) {
296
- return {
297
- url: url,
298
- method: this.readMethod
299
- };
300
- },
301
-
302
- /**
303
- * Creates a params object suitable for sending as POST data to the server
304
- * @param {ExtMVC.model.Base} instance The models instance to build post data for
305
- * @return {Object} Params object to send to the server
306
- */
307
- buildPostData: function(instance) {
308
- var data = {},
309
- prefix = instance.modelName.underscore();
310
-
311
- for (key in instance.data) {
312
- data[prefix + '[' + key + ']'] = instance.data[key];
313
- }
314
-
315
- return data;
316
- },
317
-
318
- /**
319
- * Decodes response text received from the server as the result of requesting data for a single record.
320
- * By default this expects the data to be in the form {"model_name": {"key": "value", "key2", "value 2"}}
321
- * and would return an object like {"key": "value", "key2", "value 2"}
322
- * @param {String} responseText The raw response text
323
- * @param {Function} constructor The constructor used to construct model instances. Useful for access to the prototype
324
- * @return {Object} Decoded data suitable for use in a model constructor
325
- */
326
- decodeSingleLoadResponse: function(responseText, constructor) {
327
- var tname = constructor.prototype.tableName;
328
- return Ext.decode(responseText)[tname];
329
- },
330
-
331
- //private
332
- findUrl: function(conditions, constructor) {
333
- if (typeof(conditions) == 'object' && conditions.primaryKey) {
334
- //find by ID
335
- var instance = new constructor({});
336
- instance.set(instance.primaryKey, conditions.primaryKey);
337
- delete conditions.primaryKey;
338
-
339
- return this.instanceUrl(instance);
340
- } else {
341
- //find by conditions
342
- return this.collectionUrl(constructor);
343
- }
344
- }
345
- });
@@ -1,68 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.plugin.adapter.RESTJSONAdapter
3
- * @extends ExtMVC.model.plugin.adapter.RESTAdapter
4
- * An adapter which hooks into a RESTful server side API that expects JSON for its data storage
5
- */
6
- ExtMVC.model.plugin.adapter.RESTJSONAdapter = Ext.extend(ExtMVC.model.plugin.adapter.RESTAdapter, {
7
-
8
- /**
9
- * Performs the actual save request. Uses POST for new records, PUT when updating existing ones
10
- * puts the data into jsonData for the request
11
- */
12
- doSave: function(instance, options) {
13
- if (typeof instance == 'undefined') throw new Error('No instance provided to REST Adapter save');
14
-
15
- Ext.applyIf(options || {}, {
16
- jsonData: instance.data,
17
- params : {}, //ensures that params aren't appended to the end of the url
18
- headers : {
19
- "Content-Type": "application/json"
20
- }
21
- });
22
-
23
- ExtMVC.model.plugin.adapter.RESTJSONAdapter.superclass.doSave.apply(this, arguments);
24
- },
25
-
26
- /**
27
- * Performs the actual destroy request. This simply adds an 'application/json' content type to the headers
28
- */
29
- doDestroy: function(instance, options, constructor) {
30
- options = options || {};
31
-
32
- Ext.applyIf(options, {
33
- headers: {
34
- "Content-Type": "application/json"
35
- }
36
- });
37
-
38
- ExtMVC.model.plugin.adapter.RESTJSONAdapter.superclass.doDestroy.call(this, instance, options, constructor);
39
- },
40
-
41
- /**
42
- * Decodes response text received from the server as the result of requesting data for a single record.
43
- * By default this expects the data to be in the form {"model_name": {"key": "value", "key2", "value 2"}}
44
- * and would return an object like {"key": "value", "key2", "value 2"}
45
- * @param {String} responseText The raw response text
46
- * @param {Function} constructor The constructor used to construct model instances. Useful for access to the prototype
47
- * @return {Object} Decoded data suitable for use in a model constructor
48
- */
49
- decodeSingleLoadResponse: function(responseText, constructor) {
50
- var tname = ExtMVC.Inflector.singularize(constructor.prototype.tableName);
51
- return Ext.decode(responseText)[tname];
52
- },
53
-
54
- /**
55
- * Returns configuration data to be used by the DataProxy when loading records. Override to provide your own config
56
- * @param {String} url The url the proxy should use. This is typically calculated elsewhere
57
- * @return {Object} Configuration for the proxy
58
- */
59
- buildProxyConfig: function(url) {
60
- var defaults = ExtMVC.model.plugin.adapter.RESTJSONAdapter.superclass.buildProxyConfig.apply(this, arguments);
61
-
62
- return Ext.apply(defaults, {
63
- headers: {
64
- "Content-Type": "application/json"
65
- }
66
- });
67
- }
68
- });
@@ -1,42 +0,0 @@
1
- /**
2
- * Method Collection Individual
3
- * create yes yes (but different)
4
- * build yes yes (might be different)
5
- * find yes no
6
- * loaded yes no
7
- * count yes no
8
- * destroy yes yes (but different)
9
- */
10
-
11
-
12
- // ExtMVC.model.Adapter.Abstract = {
13
- // initialize: function(model) {
14
- //
15
- // },
16
- //
17
- // classMethods: {
18
- // find: function(options) {
19
- //
20
- // },
21
- //
22
- // findById: function(id, options) {
23
- // return this.findByField('id', id, options);
24
- // },
25
- //
26
- // findByField: function(fieldName, matcher, options) {
27
- //
28
- // },
29
- //
30
- // findAll: function(options) {
31
- //
32
- // }
33
- // },
34
- //
35
- // instanceMethods: {
36
- // save: Ext.emptyFn,
37
- //
38
- // reload: Ext.emptyFn,
39
- //
40
- // destroy: Ext.emptyFn
41
- // }
42
- // };