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,192 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.plugin.association
3
- * @ignore
4
- */
5
- ExtMVC.model.plugin.association = {
6
- /**
7
- * This function is called every time a model is created via ExtMVC.model.create
8
- * (*NOT* when a model instance is instantiated). Here we initialize associations
9
- * on this model.
10
- */
11
- initialize: function(model) {
12
- var proto = model.prototype,
13
- assoc = ExtMVC.model.plugin.association;
14
-
15
- this.resolveDependencies(model);
16
-
17
- if (proto.hasMany) {
18
- Ext.each(this.parseParams(proto.hasMany, 'HasMany'), function(params) {
19
- this.define(assoc.HasMany, model, params);
20
- }, this);
21
- }
22
-
23
- if (proto.belongsTo) {
24
- Ext.each(this.parseParams(proto.belongsTo, 'BelongsTo'), function(params) {
25
- this.define(assoc.BelongsTo, model, params);
26
- }, this);
27
- }
28
- },
29
-
30
- /**
31
- * @property dependencies
32
- * @type ExtMVC.lib.Dependencies
33
- * Dependencies class to manage associations on currently undefined models
34
- */
35
- dependencies: new ExtMVC.lib.Dependencies(),
36
-
37
- /**
38
- * Defines a new association between two models. If both models have already been created,
39
- * the association is created immediately, otherwise it is deferred until both models have been created
40
- * You should never have to call this manually...
41
- * @param {Function} constructor The Association constructor to use (one of BelongsTo or HasMany)
42
- * @param {ExtMVC.model.Base} model The model which owns the association
43
- * @param {Object} params Association params such as associationName and associatedClass
44
- */
45
- define: function(constructor, model, params) {
46
- var modelNS = ExtMVC.model.modelNamespace,
47
- associatedClass = params.associatedClass,
48
- modelName = model.prototype.modelName;
49
-
50
- if (typeof modelNS[associatedClass] == 'function') {
51
- //create the model now
52
- this.create.call(this, constructor, modelName, params);
53
- } else {
54
- //create the model later
55
- params.associationConstructor = constructor;
56
- this.dependencies.add(associatedClass, modelName, params);
57
- }
58
- },
59
-
60
- /**
61
- * Creates an association once both models in question have been created
62
- * @param {Function} constructor The association constructor (should be HasMany or BelongsTo function)
63
- * @param {String} modelName The name of the model on which the association is to be defined
64
- * @param {Object} params Parameters for the association, containing at least the following properties:
65
- */
66
- create: function(constructor, modelName, params) {
67
- var modelNS = ExtMVC.model.modelNamespace,
68
- model = modelNS[modelName],
69
- associatedModel = modelNS[params.associatedClass],
70
- associationName = params.associationName;
71
-
72
- model.prototype[associationName] = new constructor(model, associatedModel, params);
73
- },
74
-
75
- /**
76
- * This is called immediately by initialize(). Associations are often specified on models that haven't
77
- * been created yet, so we keep a list of dependent associations which are to be defined as soon as the
78
- * model has been created. This method is called with the Model constructor function, looks up any associations
79
- * that couldn't previously be defined (as this model did not yet exist), and creates them no
80
- * @param {ExtMVC.model.Base} model The newly created model
81
- */
82
- resolveDependencies: function(model) {
83
- var dependents = this.dependencies.get(model.prototype.modelName);
84
-
85
- Ext.each(dependents || [], function(dependent) {
86
- var constructor = dependent.config.associationConstructor;
87
- delete dependent.config.associationConstructor;
88
-
89
- this.create(constructor, dependent.name, dependent.config);
90
- }, this);
91
- },
92
-
93
- /**
94
- * Parses belongsTo and hasMany params into a unified format
95
- * @param {Mixed} params String, Object or Array
96
- * @param {String} associationType BelongsTo or HasMany - decides how to generate the default association name
97
- * @return {Array} An array of normalized params objects
98
- */
99
- parseParams: function(params, associationType) {
100
- var results = [],
101
- associationType = associationType || 'BelongsTo',
102
- inflectMethod = associationType == 'BelongsTo' ? 'singularize' : 'pluralize';
103
-
104
- /**
105
- * We're either passed a string, an object, or an array containing one or more
106
- * of each...
107
- */
108
- if (Ext.isArray(params)) {
109
- Ext.each(params, function(association) {
110
- results.concat(this.parseParams(association));
111
- }, this);
112
- return results;
113
-
114
- } else {
115
- if (typeof params == 'string') {
116
- params = {associatedClass: params};
117
- }
118
-
119
- var assocClass = params.associatedClass,
120
- assocName = typeof assocClass == 'function'
121
- ? ExtMVC.Inflector[inflectMethod](assocClass.prototype.modelName)
122
- : ExtMVC.Inflector[inflectMethod](assocClass);
123
-
124
- Ext.applyIf(params, {
125
- extend: {},
126
- associationName: assocName
127
- });
128
-
129
- results.push(params);
130
- }
131
-
132
- return results;
133
- }
134
- };
135
-
136
- /**
137
- * @class ExtMVC.model.plugin.association.Base
138
- * Association Base class which provides basic functionality for other Association classes to build upon
139
- * Don't use directly - instead use the HasMany or BelongsTo classes.
140
- */
141
- ExtMVC.model.plugin.association.Base = function(ownerClass, associatedClass, config) {
142
- config = config || {};
143
-
144
- this.ownerClass = ownerClass;
145
- this.associatedClass = associatedClass;
146
-
147
- Ext.apply(this, config.extend || {});
148
- this.initialConfig = config;
149
-
150
- this.initialize();
151
- };
152
-
153
- ExtMVC.model.plugin.association.Base.prototype = {
154
- /**
155
- * Sets up default values for foreignKey
156
- */
157
- initialize: Ext.emptyFn
158
- };
159
-
160
- /**
161
- * @class ExtMVC.model.plugin.association.BelongsTo
162
- * @extends ExtMVC.model.plugin.association.Base
163
- * A belongsTo association
164
- */
165
- ExtMVC.model.plugin.association.BelongsTo = Ext.extend(ExtMVC.model.plugin.association.Base, {
166
- initialize: function() {
167
- Ext.apply(this, {
168
- name: ExtMVC.Inflector.singularize(this.associatedClass.prototype.tableName),
169
- foreignKey: this.associatedClass.prototype.foreignKeyName
170
- });
171
- }
172
- });
173
-
174
- /**
175
- * @class ExtMVC.model.plugin.association.HasMany
176
- * @extends ExtMVC.model.plugin.association.Base
177
- * A hasMany association
178
- */
179
- ExtMVC.model.plugin.association.HasMany = Ext.extend(ExtMVC.model.plugin.association.Base, {
180
-
181
- /**
182
- * Set up default values for name etc
183
- */
184
- initialize: function() {
185
- Ext.apply(this, {
186
- name: this.associatedClass.prototype.tableName,
187
- foreignKey: this.ownerClass.prototype.foreignKeyName
188
- });
189
- }
190
- });
191
-
192
- ExtMVC.model.addPlugin(ExtMVC.model.plugin.association);
@@ -1,87 +0,0 @@
1
- /**
2
- * Method Collection Individual
3
- * create yes yes (but different)
4
- * build yes yes
5
- * find yes no
6
- * loaded yes yes (but different)
7
- * count yes no
8
- * destroy yes yes (but different)
9
- */
10
-
11
- /**
12
- * Method HasMany BelongsTo
13
- * create yes no
14
- * build yes no
15
- * destroy yes yes
16
- * find yes yes
17
- */
18
-
19
- /**
20
- * User.find(1, {
21
- * success: function(user) {
22
- * //on belongs to associations
23
- * user.group.destroy();
24
- * user.group.find({success: function(group) {}});
25
- * user.group.set(someGroupInstance); //someGroupInstance must be a saved record (e.g. have an ID)
26
- *
27
- * //on has many associations
28
- * user.posts.destroy(1);
29
- * user.posts.find({id: 1, conditions: [{field: 'title', comparator: '=', value: 'some title'}]}, options);
30
- * user.posts.create(data, options)
31
- * user.posts.build(data)
32
- * }
33
- * };
34
- */
35
-
36
- // ExtMVC.Model.define('User', {
37
- // fields: [],
38
- // belongsTo: "Group",
39
- // hasMany: [{
40
- // name: 'posts',
41
- // className: 'Post',
42
- // foreignKey: 'user_id',
43
- //
44
- // extend: {
45
- // //some functions
46
- // }
47
- // }]
48
- // });
49
- //
50
- // user.posts.find(1, {
51
- // success: function() {},
52
- // failure: function() {}
53
- // });
54
- //
55
- // user.posts.create({}, {
56
- // success: function() {},
57
- // failure: function() {}
58
- // });
59
- //
60
- // user.posts.build({});
61
- //
62
- // user.posts.loaded();
63
- // user.posts.count();
64
- // user.posts.destroy(1);
65
- //
66
- // ExtMVC.Model.define('Post', {
67
- // fields: [],
68
- // belongsTo: [{
69
- // name: 'user',
70
- // className: 'User',
71
- // foreignKey: 'user_id',
72
- //
73
- // extend: {
74
- // //some functions
75
- // }
76
- // }],
77
- // hasMany: 'Comment'
78
- // });
79
- //
80
- // post.user.find();
81
- // post.user.loaded();
82
- // post.user.destroy();
83
- //
84
- // ExtMVC.Model.define('Comment', {
85
- // fields: [],
86
- // belongsTo: "Post"
87
- // });
@@ -1,136 +0,0 @@
1
- /**
2
- * @class ExtMVC.model.plugin.validation
3
- * @ignore
4
- */
5
-
6
- /**
7
- * @class ExtMVC.model.plugin.validation.Errors
8
- * Simple class to collect validation errors on a model and return them in various formats. Usage:
9
- <pre><code>
10
- ExtMVC.model.define("SomeModel", {
11
- fields: [
12
- {name: 'title', type: 'string'},
13
- {name: 'price', type: 'int'},
14
- {name: 'stock', type: 'int'},
15
- {name: 'colour', type: 'string'}
16
- ],
17
-
18
- validatesPresenceOf : ["title", "price"],
19
- validatesLengthOf : {field: 'title', minimum: 3, maximum: 12}
20
- });
21
-
22
- var s = new SomeModel({title: 'Some really long title'});
23
- s.errors; //returns this Errors object
24
- s.isValid(); //returns false, same as calling s.errors.isValid()
25
-
26
- //manually add a validation error on the title field
27
- s.errors.add('title', 'has an problem of some kind');
28
-
29
- this.errors.forField('title'); //returns an array of problems with the title field
30
-
31
- this.errors.forForm(); //returns an object suitable for marking fields invalid on a form
32
- </code></pre>
33
- */
34
- ExtMVC.model.plugin.validation.Errors = function() {
35
- /**
36
- * @property errors
37
- * @type Object
38
- * Object containing all errors attached to this model. This is READ ONLY - do not interact with directly
39
- */
40
- this.all = {};
41
- };
42
-
43
- ExtMVC.model.plugin.validation.Errors.prototype = {
44
-
45
- /**
46
- * Returns an errors object suitable for applying to a form via BasicForm's markInvalid() method
47
- * @return {Object} An object with field IDs as keys and formatted error strings as values
48
- */
49
- forForm: function() {
50
- var formErrors = {};
51
- for (key in this.all) {
52
- formErrors[key] = this.forField(key, true);
53
- }
54
-
55
- return formErrors;
56
- },
57
-
58
- /**
59
- * @property multipleErrorConnector
60
- * @type String
61
- * The string to use when connecting more than one error (defaults to 'and')
62
- */
63
- multipleErrorConnector: 'and',
64
-
65
- /**
66
- * Clears out all errors
67
- */
68
- clear: function() {
69
- this.all = {};
70
- },
71
-
72
- /**
73
- * Adds an error to a particular field
74
- * @param {String} field The field to add an error onto
75
- * @param {String} error The error message
76
- */
77
- add: function(field, error) {
78
- this.all[field] = this.all[field] || [];
79
- this.all[field].push(error);
80
- },
81
-
82
- /**
83
- * Returns an array of all errors for the given field. Pass true as a second argument to
84
- * return a human-readable string, e.g.:
85
- <pre><code>
86
- forField('title'); // ['must be present', 'is too short']
87
- forField('title', true); // 'must be present and is too short'
88
- </code></pre>
89
- * @param {String} field The field to find errors for
90
- * @param {Boolean} humanize True to turn the errors array into a human-readable string (defaults to false)
91
- * @return {Array|String} An array of errors for this field, or a string
92
- */
93
- forField: function(field, humanize) {
94
- humanize = humanize || false;
95
- var errs = this.all[field] || [];
96
-
97
- return humanize ? errs.toSentence(this.multipleErrorConnector) : errs;
98
- },
99
-
100
- /**
101
- * Returns true if this model currently has no validation errors
102
- * @return {Boolean} True if this model is currently valid
103
- */
104
- isValid: function(paramName) {
105
- for (key in this.all) {return false;}
106
-
107
- return true;
108
- },
109
-
110
- /**
111
- * Parses server response to a failed save, adding each error message to the appropriate field. Override to provide
112
- * an implementation for your own server responses. The default implementation accepts a response like this:
113
- * {errors: [['some_field', 'some error regarding some_field'], ['another_field', 'another error']]}
114
- * @param {Object/String} serverErrors A errors object returned by server-side validations. If this is a string it will
115
- * @param {Boolean} preserveErrors False to clear all errors before adding errors from server (defaults to false)
116
- * automatically be turned into an object via Ext.decode
117
- */
118
- readServerErrors: function(serverErrors, preserveErrors) {
119
- var serverErrors = serverErrors || {};
120
-
121
- //remove any existing errors unless instructed to preserve them
122
- if (preserveErrors !== true) {this.clearErrors();}
123
-
124
- //make sure we're dealing with an object
125
- if (typeof(serverErrors) == 'string') {
126
- serverErrors = Ext.decode(serverErrors);
127
- };
128
-
129
- var rawErrors = serverErrors.errors;
130
- if (rawErrors) {
131
- for (var i=0; i < rawErrors.length; i++) {
132
- this.all.push(rawErrors[i]);
133
- };
134
- };
135
- }
136
- };
@@ -1,139 +0,0 @@
1
- /**
2
- * This is the Validation plugin definition, which mixes in validation.Errors
3
- * and some other functions into a model prototype
4
- * @ignore
5
- */
6
-
7
- /**
8
- * Overrides Ext.data.Record's isValid() function.
9
- * We apply this to Record's prototype as there is no need to define it per model or instance
10
- * @ignore
11
- */
12
- Ext.apply(Ext.data.Record.prototype, {
13
- isValid: function() {
14
- if (this.validations) {
15
- if (!this.errors) this.errors = new ExtMVC.model.plugin.validations.Errors();
16
-
17
- this.errors.clear();
18
-
19
- //test each validation, add to errors if any fail
20
- Ext.each(this.validations, function(validation) {
21
- if (!validation.isValid(this)) {
22
- this.errors.add(validation.field, validation.message);
23
- };
24
- }, this);
25
- };
26
-
27
- return this.errors.isValid();
28
- }
29
- });
30
-
31
- /**
32
- * @ignore
33
- * FIXME: This is possibly the most horrendous hack ever. I'm so sorry :(
34
- *
35
- * The basic problem is that we need to add an errors object to every Record instance,
36
- * which means we need to hook into the constructor somehow. Sadly everything I tried
37
- * to overload the constructor directly failed, so this horrific hack has been done instead
38
- */
39
- (function() {
40
- var oldPrototype = Ext.data.Record.prototype,
41
- oldConstructor = Ext.data.Record,
42
- oldFunctionMethods = {};
43
-
44
- for (var method in Ext.data.Record) {
45
- oldFunctionMethods[method] = Ext.data.Record[method];
46
- }
47
-
48
- Ext.data.Record = function(data, id) {
49
- oldConstructor.apply(this, arguments);
50
-
51
- this.errors = new ExtMVC.model.plugin.validation.Errors();
52
- };
53
-
54
- for (var method in oldFunctionMethods) {
55
- Ext.data.Record[method] = oldFunctionMethods[method];
56
- }
57
- })();
58
- /**
59
- * Again, I'm really sorry :(
60
- * @ignore
61
- */
62
-
63
- /**
64
- * @class ExtMVC.model.plugin.validation.Plugin
65
- */
66
- ExtMVC.model.plugin.validation.Plugin = {
67
- /**
68
- * Initializes this plugin for a given model. This is called every time a model is *created*
69
- * via ExtMVC.model.create, not when a model object is *instantiated*
70
- * @param {ExtMVC.model} model The model to initialize the plugin for
71
- */
72
- initialize: function(model) {
73
- this.model = model;
74
-
75
- Ext.apply(model.prototype, {
76
- /**
77
- * @property validations
78
- * @type Array
79
- * An array of all validations performed on this model
80
- */
81
- validations: this.parseValidations()
82
- });
83
- },
84
-
85
- /**
86
- * Parses a defined model's prototype for validation declarations and creates validation instances
87
- * @return {Array} An Array of validation objects
88
- */
89
- parseValidations: function() {
90
- var validations = [];
91
-
92
- for (var validation in ExtMVC.model.plugin.validation) {
93
- if (/^validate/.test(validation.toLowerCase())) {
94
-
95
- //for each validation type defined on ExtMVC.model.plugin.validation, check to see if we are using
96
- //it in on our model
97
- for (var modelKey in this.model.prototype) {
98
- if (modelKey.toLowerCase() == validation.toLowerCase()) {
99
- //this validation is being used by the model, so add it now
100
- var validationConstructor = ExtMVC.model.plugin.validation[validation],
101
- validationOptions = this.model.prototype[modelKey];
102
-
103
- if (!Ext.isArray(validationOptions)) {
104
- validationOptions = [validationOptions];
105
- };
106
-
107
- Ext.each(validationOptions, function(options) {
108
- validations.push(this.buildValidation(validationConstructor, options));
109
- }, this);
110
- };
111
- }
112
- };
113
- }
114
-
115
- return validations;
116
- },
117
-
118
- /**
119
- * Creates a new Validation object based on the passed constructor and options
120
- * @param {Function} validation The validation constructor function
121
- * @param {Object|String} options A fieldname string, or config object
122
- * @return {ExtMVC.model.plugin.validation.AbstractValidation} The validation instance
123
- */
124
- buildValidation: function(validation, options) {
125
- var field, config = {};
126
-
127
- if (typeof options == 'string') {
128
- field = options;
129
- } else {
130
- field = options.field;
131
- delete options.field;
132
- config = options;
133
- }
134
-
135
- return new validation(this.model, field, config);
136
- }
137
- };
138
-
139
- ExtMVC.model.addPlugin(ExtMVC.model.plugin.validation.Plugin);