extjs-mvc 0.4.0.f → 0.4.0.g

Sign up to get free protection for your applications and to get access to all the features.
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,131 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.Cache
3
- * @extends Ext.util.Observable
4
- * Provides an interface for caching model objects which have been fetched from some database/backend
5
- */
6
- ExtMVC.model.Cache = function(config) {
7
- var config = config || {};
8
-
9
- ExtMVC.model.Cache.superclass.constructor.call(this, config);
10
-
11
- this.addEvents(
12
- /**
13
- * @event beforeadd
14
- * Fires before an item is added to the cache
15
- * @param {ExtMVC.model} modelObject The model which is about to be added
16
- */
17
- 'beforeadd',
18
-
19
- /**
20
- * @event add
21
- * Fires after an item is added to the cache
22
- * @param {ExtMVC.model} modelObject The model which was just added
23
- */
24
- 'add',
25
-
26
- /**
27
- * @event beforeclear
28
- * Fires before the cache is cleared
29
- * @param {Number} seconds The number of seconds worth of caches which will be saved
30
- */
31
- 'beforeclear',
32
-
33
- /**
34
- * @event clear
35
- * Fires after the cache has been cleared
36
- * @param {Number} seconds The number of seconds worth of caches which were saved
37
- */
38
- 'clear'
39
- );
40
- };
41
-
42
- Ext.extend(ExtMVC.model.Cache, Ext.util.Observable, {
43
-
44
- /**
45
- * @property caches
46
- * @type Object
47
- * Maintains all cached objects
48
- */
49
- caches: {},
50
-
51
- /**
52
- * Adds the given model object to the cache. Automatically stores the datetime of the add
53
- * @param {ExtMVC.model} modelObject The model you want to store in the cache
54
- */
55
- add: function(modelObject) {
56
- if (this.fireEvent('beforeadd', modelObject)) {
57
- var modelName = modelObject.className;
58
- var modelId = modelObject.data.id;
59
-
60
- if (modelName && modelId) {
61
- modelObject.cachedAt = new Date();
62
-
63
- this.caches[modelName] = this.caches[modelName] || {};
64
- this.caches[modelName][modelId] = modelObject;
65
-
66
- this.fireEvent('add', modelObject);
67
- return true;
68
- } else {
69
-
70
- return false;
71
- };
72
- }
73
- },
74
-
75
- /**
76
- * Fetches an object from the cache
77
- * @param {Object} params params object which must contain at least modelName and id. Optionally
78
- * supply staleTime, which is the number of seconds old the cached object is allowed to be to get a hit,
79
- * or a Date which will restrict hits to anything cached after that date
80
- * @return {ExtMVC.model/null} The model if found, or null
81
- */
82
- fetch: function(params) {
83
- this.caches[params['modelName']] = this.caches[params['modelName']] || {};
84
-
85
- var params = params || {};
86
- var hit = this.caches[params['modelName']][params['id']];
87
-
88
- if (hit) {
89
- if (params.staleTime) {
90
- if (typeof params.staleTime == 'number') {
91
- var date = new Date();
92
- date.setTime(date.getTime() - (1000 * params.staleTime));
93
- params.staleTime = date;
94
- };
95
-
96
- //make sure we have a date object
97
- if (params.staleTime.getTime && hit.cachedAt > params.staleTime) {
98
- return hit;
99
- }
100
- } else {
101
- return hit;
102
- };
103
- };
104
- },
105
-
106
- /**
107
- * Clears all objects more than the given number of seconds old (defaults to clearing all objects)
108
- * @param {Number} seconds The number of seconds to keep cached objects for (e.g. setting this to 10 would delete anything cached more than 10 seconds ago)
109
- */
110
- clear: function(seconds) {
111
- var seconds = seconds || 0;
112
- var date = new Date();
113
- date.setTime(date.getTime() - (1000 * seconds));
114
-
115
- if (this.fireEvent('beforeclear', seconds)) {
116
- if (seconds == 0) {
117
- this.caches = {};
118
- } else {
119
- for (var i=0; i < this.caches.length; i++) {
120
- for (var j=0; j < this.caches[i].length; j++) {
121
- if (this.caches[i][j].cachedAt < date) {
122
- delete this.caches[i][j];
123
- };
124
- };
125
- };
126
- };
127
-
128
- this.fireEvent('clear', seconds);
129
- }
130
- }
131
- });
@@ -1,160 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.HasManyAssociation
3
- * @extends ExtMVC.model.Association
4
- */
5
- ExtMVC.model.HasManyAssociation = function(ownerObject, config) {
6
- var config = config || {};
7
-
8
- Ext.applyIf(config, {
9
- offset: 0,
10
- limit: 25,
11
- associationName: ExtMVC.model.Association.hasManyAssociationName(config.name)
12
- });
13
-
14
- //TODO: these should be abstracted to a parent object (as should private vars and funcs below)
15
- Ext.applyIf(config, {
16
- primaryKey: 'id',
17
- foreignKey: ownerObject.foreignKeyName,
18
- extend: {},
19
-
20
- className: (ownerObject.constructor.namespace ? ownerObject.constructor.namespace + '.' + config.name : config.name)
21
- });
22
-
23
- //get a reference to the class definition function of the associated object
24
- //(e.g. a hasMany: ['Post'] association will return a reference to Post)
25
- var associatedObjectClass = eval(config.className);
26
-
27
- /**
28
- * Private, calls the ownerObject's class method with the supplied args
29
- */
30
- function callOwnerObjectClassMethod(method, args, scope) {
31
- return ownerObject.constructor[method].apply(scope || ownerObject.constructor, args || []);
32
- };
33
-
34
- /**
35
- * Private, calls the associated object's class method with the supplied args
36
- */
37
- function callAssociatedObjectClassMethod (method, args, scope) {
38
- return associatedObjectClass[method].apply(scope || associatedObjectClass, args || []);
39
- }
40
-
41
- return Ext.applyIf(config.extend, {
42
-
43
- /**
44
- * @property associationName
45
- * @type String
46
- * Returns the name of this association so that the model can add it to its definition
47
- */
48
- associationName: config.associationName,
49
-
50
- /**
51
- * @property associationType
52
- * @type String
53
- * The type of association (hasMany or belongsTo)
54
- */
55
- associationType: 'hasMany',
56
-
57
- /**
58
- * Returns the URL for this association - e.g. if model User hasMany Posts, user.posts.url() will
59
- * return something like /users/1/posts.
60
- * Pass additional parameter options as arguments to pass straight through to the URL builder - e.g.:
61
- * user.posts.url('published'); // = /users/1/posts/published
62
- * @return {String} The URL for the has many resource
63
- */
64
- url: function() {
65
- var args = [ownerObject, associatedObjectClass];
66
- for (var i=0; i < arguments.length; i++) {
67
- args.push(arguments[i]);
68
- };
69
-
70
- return ExtMVC.UrlBuilder.urlFor.apply(ExtMVC.UrlBuilder, args);
71
- },
72
-
73
- /**
74
- * Passes through to the owner class's findById class method, adding a foreign key constraint first
75
- * @param {String} id The ID of the associated object to retrieve
76
- * @param {Object} options Options passed along to the associated model's Class's findById method. Pass in loadSuccess, loadFailure, conditions, order etc here
77
- */
78
- findById: function(id, options) {
79
- var options = options || {};
80
-
81
- //add a condition to constrain to the owner object's id
82
- if (!options.conditions) { options.conditions = []; }
83
- options.conditions.push({
84
- key: config.foreignKey,
85
- value: ownerObject.data[config.primaryKey]
86
- });
87
-
88
- return callAssociatedObjectClassMethod('findById', [id, options]);
89
- },
90
-
91
- findAll: function(storeOptions) {
92
- var storeOptions = storeOptions || {};
93
- Ext.applyIf(storeOptions, {
94
- url: this.url(),
95
-
96
- listeners: {
97
-
98
- //Once we have fetched all hasMany records, make sure newRecord is false, and set the parent
99
- //relationship to point to this ownerObject (The object which hasMany of these records)
100
- 'load': {
101
- scope: this,
102
- fn: function(store, records, options) {
103
- Ext.each(records, function(record) {
104
- record.newRecord = false;
105
- if (record.parent && record.parent.set) {
106
- record.parent.set(ownerObject);
107
- }
108
- }, this);
109
- }
110
- }
111
- }
112
- });
113
-
114
- return callAssociatedObjectClassMethod('findAll', [storeOptions]);
115
- },
116
-
117
- /**
118
- * Creates (builds and attempts to save) this associated model
119
- * @param {Object} fields Object with keys and values to initialise this object
120
- * @param {Object} saveConfig Passed to the Ext.Ajax request, supply success and failure options here
121
- */
122
- create: function(fields, saveConfig) {
123
- return this.build(fields).save(saveConfig);
124
- },
125
-
126
- /**
127
- * Builds an instantiation of the associated model with the supplied data.
128
- * Automatically links in the correct foreign key
129
- * @param {Object} fields The data to initialize this object with
130
- */
131
- build: function(fields) {
132
- var fields = fields || {};
133
-
134
- //instantiate the new object with the augmented fields
135
- var obj = new associatedObjectClass(fields);
136
-
137
- //set up the object's belongsTo association. This also sets up the foreign key
138
- var assocName = ExtMVC.model.Association.belongsToAssociationName(ownerObject.className);
139
- obj[assocName].set(ownerObject);
140
-
141
- return obj;
142
- },
143
-
144
- /**
145
- * Adds an existing (saved) instantiation of the associated model to this model's hasMany collection
146
- * @param {ExtMVC.model} modelObject The existing, saved model
147
- */
148
- add: function(modelObject) {
149
- //TODO: implement this
150
-
151
- },
152
-
153
- destroy: function(id) {
154
- //TODO: implement this
155
-
156
- }
157
- });
158
- };
159
-
160
- // Ext.extend(ExtMVC.model.HasManyAssociation, ExtMVC.model.Association);
@@ -1,331 +0,0 @@
1
- /**
2
- * @class ExtMVC.model
3
- * @extends Object
4
- * Manages the definition and creation of model classes.
5
- *
6
- * <h2>Defining models</h2>
7
- * <p>Models in your application are defined using Ext.model.define, which is given 2 arguments - the String name of your model and a config object</p>
8
- * <p>
9
- * <pre><code>
10
- ExtMVC.model.define("MyModel", {
11
- fields: [
12
- {name: 'id', type: 'int'},
13
- {name: 'title', type: 'string'},
14
- {name: 'price', type: 'int'}
15
- ],
16
-
17
- validatesPresenceOf: ['id', 'title'],
18
- classMethods: {
19
- doSomething: function() {alert('oh hi!');}
20
- }
21
- });
22
- </code></pre>
23
- *
24
- * Fields are passed straight to the underlying Ext.data.Record.
25
- * classMethods are defined on the constructor function, e.g. from the example above:
26
- *
27
- <pre><code>
28
- MyModel.doSomething(); //alerts 'oh hi'
29
- </code></pre>
30
- *
31
- * All other properties are simply assigned to the Model's prototype, but may be intercepted by plugins
32
- *
33
- * <h2>Extending other models</h2>
34
- * Models can extend other models using the 'extend' property:
35
- <pre></code>
36
- ExtMVC.model.define("Product", {
37
- fields: [...]
38
- }
39
-
40
- ExtMVC.model.define("Flower", {
41
- extend: "Product",
42
- fields: [...]
43
- }
44
- </code></pre>
45
- *
46
- * The class builds a simple dependency graph to allow models to extend other models, e.g.:
47
- *
48
- <pre><code>
49
- //this model definition will not actually be created until SuperUser has been defined
50
- ExtMVC.model.define("SuperUser", {
51
- extend: "User",
52
- fields: [
53
- {name: 'isAdmin', type: 'bool'}
54
- ]
55
- });
56
-
57
- //SuperUser does not extend anything, so is created immediately. User is then also created
58
- ExtMVC.model.define("User", {
59
- fields: [
60
- {name: 'id', type: 'int'},
61
- {name: 'username', type: 'string'}
62
- ],
63
-
64
- validatesPresenceOf: ['id', 'username']
65
- });
66
-
67
- //At this point both SuperUser and User have been created and are instantiable and extendable.
68
- </code></pre>
69
- *
70
- * When a model extends another one it inherits all of that model's instance and class methods. It also
71
- * inherits all of the superclass model's fields, overwriting if redefined in the subclass. In the example
72
- * above the SuperUser model would have fields 'id', 'username' and 'isAdmin', and will also have inherited
73
- * User's validatesPresenceOf declaration
74
- *
75
- * @singleton
76
- */
77
- ExtMVC.model = {
78
- /**
79
- * @property pendingCreation
80
- * @type Object
81
- * An object of model creation configurations awaiting definition because their dependency model(s) have not yet
82
- * been defined. e.g. {'User': [{name: 'SuperUser', config: someConfigObject}, {name: 'AdminUser', config: anotherCfgObj}]}
83
- * signifies that SuperUser and AdminUser should be defined as soon as User has been defined
84
- */
85
- pendingCreation: {},
86
-
87
- /**
88
- * Returns an array of any Model subclasses waiting for this model to be defined
89
- * @param {String} modelName The dependency model name to check against
90
- * @return {Array} An array of model definitions (e.g. [{name: 'MyModel', config: someObject}])
91
- */
92
- getModelsPendingDefinitionOf: function(modelName) {
93
- return this.pendingCreation[modelName] || [];
94
- },
95
-
96
- /**
97
- * Adds a model definition to the pendingCreation object if it is waiting for another model to be defined first
98
- * @param {String} dependencyModelName The name of another model which must be created before this one
99
- * @param {String} dependentModelName The name of the new model to be defined after its dependency
100
- * @param {Object} config The new model's config object, as sent to ExtMVC.model.define
101
- */
102
- setModelPendingDefinitionOf: function(dependencyModelName, dependentModelName, config) {
103
- var arr = this.pendingCreation[dependencyModelName] || [];
104
-
105
- arr.push({name: dependentModelName, config: config});
106
-
107
- this.pendingCreation[dependencyModelName] = arr;
108
- },
109
-
110
- /**
111
- * @property strictMode
112
- * @type Boolean
113
- * Throws errors rather than return false when performing operations such as overwriting existing models
114
- * Defaults to false
115
- */
116
- strictMode: false,
117
-
118
- /**
119
- * @property modelNamespace
120
- * @type Object
121
- * The object into which Models are defined. This defaults to window, meaning calls to ExtMVC.model.create
122
- * will create models globally scoped unless this is modified. Setting this instead to MyApp.models would
123
- * mean that a model called 'User' would be defined as MyApp.models.User instead
124
- */
125
- modelNamespace: function() {
126
- Ext.ns('ExtMVC.modelsTemp');
127
-
128
- return ExtMVC.modelsTemp;
129
- }(),
130
-
131
- /**
132
- * Sets a model up for creation. If this model doesn't extend any other Models that haven't been defined yet
133
- * it is returned immediately, otherwise it is placed into a queue and defined as soon as its dependency models
134
- * are in place. Example:
135
- *
136
- * ExtMVC.model.define('MyApp.models.MyModel', {
137
- * fields: [
138
- * {name: 'title', type: 'string'},
139
- * {name: 'price', type: 'number'},
140
- * {name: 'available', type: 'bool'}
141
- * ],
142
- *
143
- * //Adds tax to the price field
144
- * calculatePrice: function() {
145
- * return this.data.price * 1.15;
146
- * },
147
- *
148
- * classMethods: {
149
- * findAvailable: function() {
150
- * //some logic to find all available MyModel's
151
- * }
152
- * }
153
- * });
154
- *
155
- * var m = new MyApp.models.MyModel({title: 'Test', available: true, price: 100});
156
- * m.calculatePrice(); // => 115
157
- * MyApp.models.MyModel.findAvailable(); // => Returns as defined above
158
- *
159
- * @param {String} modelName The name of the model to create (e.g. 'User')
160
- * @param {Object} extensions An object containing field definitions and any extension methods to add to this model
161
- * @return {ExtMVC.model.Base/Null} The newly defined model constructor, or null if the model can't be defined yet
162
- */
163
- define: function(modelName, extensions) {
164
- var createNow = true,
165
- extensions = extensions || {};
166
-
167
- if (typeof extensions.extend != 'undefined') {
168
- var superclass = this.modelNamespace[extensions.extend];
169
- if (typeof superclass == 'undefined') {
170
- //the model we're extending hasn't been created yet
171
- createNow = false;
172
- this.setModelPendingDefinitionOf(extensions.extend, modelName, extensions);
173
- };
174
- };
175
-
176
- if (createNow) return this.create.apply(this, arguments);
177
- },
178
-
179
- /**
180
- * @ignore
181
- * Creates a new ExtMVC.model.Base subclass and sets up all fields, instance and class methods.
182
- * Don't use this directly unless you know what you're doing - use define instead (with the same arguments)
183
- *
184
- * @param {String} modelName The full model name to define, including namespace (e.g. 'MyApp.models.MyModel')
185
- * @param {Object} extensions An object containing field definitions and any extension methods to add to this model
186
- */
187
- create: function(modelName, extensions) {
188
- extensions = extensions || {};
189
-
190
- //check that this model has not already been defined
191
- if (this.isAlreadyDefined(modelName)) {
192
- if (this.strictMode) throw new Error(modelName + ' is already defined');
193
- return false;
194
- }
195
-
196
- //get a handle on the super class model if extending (this will be undefined if we are not extending another model)
197
- var superclassModel = this.modelNamespace[extensions.extend];
198
-
199
- var fields = this.buildFields(extensions.fields, superclassModel);
200
- delete extensions.fields;
201
-
202
- //create the base Ext.data.Record, which we'll extend in a moment, and assign it to our model namespace
203
- var model = this.modelNamespace[modelName] = Ext.data.Record.create(fields);
204
-
205
- //separate out any methods meant to operate at class level
206
- var classMethods = extensions.classMethods || {};
207
- delete extensions.classMethods;
208
-
209
- //extend our new record firstly with Model.Base, then apply any user extensions
210
- Ext.apply(model.prototype, extensions);
211
-
212
- //if we're extending another model, add class and instance methods now
213
- if (typeof superclassModel != 'undefined') {
214
- Ext.applyIf(classMethods, superclassModel);
215
- Ext.applyIf(model.prototype, superclassModel.prototype);
216
- };
217
-
218
- //set up the various string names associated with this model
219
- model.prototype.modelName = modelName;
220
- this.setupNames(model);
221
-
222
- //add any class methods to the class level
223
- for (var methodName in classMethods) {
224
- if (methodName != 'prototype') model[methodName] = classMethods[methodName];
225
- };
226
-
227
- this.initializePlugins(model);
228
- this.afterCreate(modelName);
229
-
230
- return model;
231
- },
232
-
233
- /**
234
- * @ignore
235
- * Creates any other models that were waiting for this one to be created. Do not override this
236
- * unless you really know what you are doing...
237
- * @param {String} modelName The name of the model that was just created
238
- */
239
- afterCreate: function(modelName) {
240
- var awaiting = this.getModelsPendingDefinitionOf(modelName);
241
- if (awaiting) {
242
- Ext.each(awaiting, function(obj) {
243
- this.create(obj.name, obj.config);
244
- }, this);
245
- };
246
- },
247
-
248
- /**
249
- * Checks if a given model name has already been defined, or is awaiting creation.
250
- * @param {String} modelName the name of the new model to check
251
- * @return {Boolean} True if the model has already been defined somewhere
252
- */
253
- isAlreadyDefined: function(modelName) {
254
- if (typeof this.modelNamespace[modelName] != "undefined") return true;
255
-
256
- var found = false;
257
-
258
- //check that this model is not awaiting creation
259
- for (superclass in this.pendingCreation) {
260
- var subclasses = this.pendingCreation[superclass];
261
- Ext.each(subclasses, function(s) {
262
- if (s.name == modelName) found = true;
263
- }, this);
264
- }
265
-
266
- return found;
267
- },
268
-
269
- /**
270
- * @ignore
271
- * Builds an array of fields for this model, adding fields from the super class if present
272
- */
273
- buildFields: function(subclassFields, superclass) {
274
- subclassFields = subclassFields || [];
275
-
276
- var fields = new Ext.util.MixedCollection(false, function(field) { return field.name; });
277
- fields.addAll(subclassFields);
278
-
279
- if (typeof superclass != 'undefined') {
280
- superclass.prototype.fields.each(function(field) {
281
- if (typeof fields.get(field.name) == 'undefined') fields.add(field);
282
- });
283
- };
284
-
285
- return fields.items;
286
- },
287
-
288
- /**
289
- * Sets up the various names required by this model, such as tableName, humanName etc
290
- * @param {Object} model The model to set up names on
291
- * @return {Object} The model, decorated with names
292
- */
293
- setupNames: function(model) {
294
- var p = model.prototype,
295
- i = ExtMVC.Inflector;
296
-
297
- Ext.applyIf(model.prototype, {
298
- tableName : i.pluralize(p.modelName.underscore()),
299
- foreignKeyName : i.singularize(p.modelName.underscore()) + '_id',
300
- singularHumanName: p.modelName.humanize().titleize(),
301
- pluralHumanName : i.pluralize(p.modelName.humanize().titleize())
302
- });
303
- },
304
-
305
- /**
306
- * @property plugins
307
- * @type Array
308
- * An array containing all plugin constructor functions - these get applied at model creation time
309
- */
310
- plugins: [],
311
-
312
- /**
313
- * Makes Model aware of a new plugin. All plugins defined here will be initialized when a model is created
314
- * @param {Function} plugin The plugin object
315
- */
316
- addPlugin: function(plugin) {
317
- this.plugins.push(plugin);
318
- },
319
-
320
- /**
321
- * Runs each plugin's initialize method with a newly created model constructor
322
- * @param {ExtMVC.model} model The model to initialize the plugin with
323
- */
324
- initializePlugins: function(model) {
325
- Ext.each(this.plugins, function(plugin) {
326
- plugin.initialize(model);
327
- }, this);
328
- }
329
- };
330
-
331
- Ext.ns('ExtMVC.model.plugin');