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.
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/extjs-mvc +0 -3
- data/lib/extjs-mvc.rb +10 -6
- data/lib/extjs-mvc/api.rb +0 -1
- metadata +8 -84
- data/lib/src/App.js +0 -219
- data/lib/src/MVC.js +0 -260
- data/lib/src/Presenter.js +0 -52
- data/lib/src/README.rdoc +0 -69
- data/lib/src/controller/Controller.js +0 -278
- data/lib/src/controller/CrudController.js +0 -460
- data/lib/src/lib/Array.js +0 -26
- data/lib/src/lib/Booter.js +0 -416
- data/lib/src/lib/ClassManager.js +0 -191
- data/lib/src/lib/ControllerClassManager.js +0 -95
- data/lib/src/lib/Dependencies.js +0 -44
- data/lib/src/lib/DispatchMatcher.js +0 -98
- data/lib/src/lib/Dispatcher.js +0 -129
- data/lib/src/lib/Environment.js +0 -43
- data/lib/src/lib/Inflector.js +0 -155
- data/lib/src/lib/ModelClassManager.js +0 -19
- data/lib/src/lib/Route.js +0 -139
- data/lib/src/lib/Router.js +0 -282
- data/lib/src/lib/String.js +0 -94
- data/lib/src/lib/ViewClassManager.js +0 -229
- data/lib/src/lib/notes.txt +0 -32
- data/lib/src/model/AdapterManager.js +0 -30
- data/lib/src/model/Association.js +0 -26
- data/lib/src/model/Base.js +0 -63
- data/lib/src/model/BelongsToAssociation.js +0 -116
- data/lib/src/model/Cache.js +0 -131
- data/lib/src/model/HasManyAssociation.js +0 -160
- data/lib/src/model/Model.js +0 -331
- data/lib/src/model/UrlBuilder.js +0 -106
- data/lib/src/model/adapters/AbstractAdapter.js +0 -296
- data/lib/src/model/adapters/MemoryAdapter.js +0 -103
- data/lib/src/model/adapters/RESTAdapter.js +0 -345
- data/lib/src/model/adapters/RESTJSONAdapter.js +0 -68
- data/lib/src/model/adapters/notes.txt +0 -42
- data/lib/src/model/associations/Association.js +0 -192
- data/lib/src/model/associations/notes.txt +0 -87
- data/lib/src/model/validations/Errors.js +0 -136
- data/lib/src/model/validations/Plugin.js +0 -139
- data/lib/src/model/validations/Validations.js +0 -276
- data/lib/src/notes/Charts.graffle +0 -0
- data/lib/src/overrides/Ext.Component.js +0 -21
- data/lib/src/overrides/Ext.extend.js +0 -142
- data/lib/src/spec/Array.spec.js +0 -15
- data/lib/src/spec/ExtMVC.spec.js +0 -65
- data/lib/src/spec/Model.spec.js +0 -370
- data/lib/src/spec/OS.spec.js +0 -83
- data/lib/src/spec/Router.spec.js +0 -99
- data/lib/src/spec/SpecHelper.js +0 -106
- data/lib/src/spec/String.spec.js +0 -83
- data/lib/src/spec/model/AbstractAdapter.spec.js +0 -49
- data/lib/src/spec/model/Associations.spec.js +0 -99
- data/lib/src/spec/model/Cache.spec.js +0 -5
- data/lib/src/spec/model/RESTAdapter.spec.js +0 -19
- data/lib/src/spec/model/ValidationErrors.spec.js +0 -64
- data/lib/src/spec/model/Validations.spec.js +0 -166
- data/lib/src/spec/model/ValidationsPlugin.spec.js +0 -108
- data/lib/src/spec/suite.html +0 -60
- data/lib/src/specs-old/JSSpec.css +0 -216
- data/lib/src/specs-old/JSSpec.js +0 -1512
- data/lib/src/specs-old/all.html +0 -66
- data/lib/src/specs-old/base.js +0 -14
- data/lib/src/specs-old/controller.js +0 -17
- data/lib/src/specs-old/diff_match_patch.js +0 -1
- data/lib/src/specs-old/model.js +0 -70
- data/lib/src/specs-old/route.js +0 -38
- data/lib/src/specs-old/router.js +0 -59
- data/lib/src/specs-old/string.js +0 -22
- data/lib/src/testrunner/JSpecFormatter.js +0 -111
- data/lib/src/testrunner/TestClient.js +0 -181
- data/lib/src/testrunner/TestGrid.js +0 -351
- data/lib/src/testrunner/TestRunner.js +0 -110
- data/lib/src/testrunner/TestViewport.js +0 -94
- data/lib/src/vendor.yml +0 -29
- data/lib/src/vendor/ext-3.1.1/vendor.yml +0 -16
- data/lib/src/view/FormWindow.js +0 -184
- data/lib/src/view/HasManyEditorGridPanel.js +0 -211
- data/lib/src/view/scaffold/Edit.js +0 -46
- data/lib/src/view/scaffold/Index.js +0 -561
- data/lib/src/view/scaffold/New.js +0 -20
- data/lib/src/view/scaffold/ScaffoldFormPanel.js +0 -255
@@ -1,19 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @class ExtMVC.lib.ModelClassManager
|
3
|
-
* @extends ExtMVC.lib.ClassManager
|
4
|
-
* Specialised class manager for managing models
|
5
|
-
*/
|
6
|
-
ExtMVC.lib.ModelClassManager = Ext.extend(ExtMVC.lib.ClassManager, {
|
7
|
-
//usual model definition stuff to go here
|
8
|
-
define: function(name) {
|
9
|
-
var overrides = this.getRegistered(name);
|
10
|
-
|
11
|
-
if (overrides == undefined) {
|
12
|
-
throw new Ext.Error(String.format("The {0} model has not been registered yet", name));
|
13
|
-
}
|
14
|
-
|
15
|
-
return this.constructors[name] = ExtMVC.model.define(name, overrides);
|
16
|
-
}
|
17
|
-
});
|
18
|
-
|
19
|
-
ExtMVC.registerClassManager('model', new ExtMVC.lib.ModelClassManager());
|
data/lib/src/lib/Route.js
DELETED
@@ -1,139 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @class ExtMVC.router.Route
|
3
|
-
* @extends Object
|
4
|
-
* TODO: [DOCS] Rewrite this horrible nonsense
|
5
|
-
*/
|
6
|
-
ExtMVC.router.Route = function(mappingString, options) {
|
7
|
-
this.mappingString = mappingString;
|
8
|
-
this.options = options || {};
|
9
|
-
|
10
|
-
//The regular expression we use to match a segment of a route mapping
|
11
|
-
//this will recognise segments starting with a colon,
|
12
|
-
//e.g. on 'namespace/:controller/:action', :controller and :action will be recognised
|
13
|
-
this.paramMatchingRegex = new RegExp(/:([0-9A-Za-z\_]*)/g);
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Converts a route string into an array of symbols starting with a colon. e.g.
|
17
|
-
* ":controller/:action/:id" => [':controller', ':action', ':id']
|
18
|
-
*/
|
19
|
-
this.paramsInMatchString = this.mappingString.match(this.paramMatchingRegex) || [];
|
20
|
-
this.paramsInStringWithOptions = [];
|
21
|
-
|
22
|
-
/**1
|
23
|
-
* Store and remove any route conditions specified
|
24
|
-
*/
|
25
|
-
this.conditions = this.options.conditions || {};
|
26
|
-
if (this.options.conditions) { delete this.options.conditions; }
|
27
|
-
|
28
|
-
for (var i=0; i < this.paramsInMatchString.length; i++) {
|
29
|
-
this.paramsInStringWithOptions.push(this.paramsInMatchString[i]);
|
30
|
-
};
|
31
|
-
|
32
|
-
for (var o in options) {
|
33
|
-
this.paramsInStringWithOptions.push(":" + o);
|
34
|
-
}
|
35
|
-
|
36
|
-
this.matcherRegex = this.convertToUsableRegex(mappingString);
|
37
|
-
};
|
38
|
-
|
39
|
-
ExtMVC.router.Route.prototype = {
|
40
|
-
/**
|
41
|
-
* @param {url} The url we want to match against this route to see if it matches
|
42
|
-
* @return {boolean} Returns true if this route matches the url
|
43
|
-
*/
|
44
|
-
recognises: function(url) {
|
45
|
-
return this.matcherRegex.test(url);
|
46
|
-
},
|
47
|
-
|
48
|
-
/**
|
49
|
-
* @param {url} The url we want to provide matches for
|
50
|
-
* @return {Object} Object of all matches for this url, as well as additional params as defined in the route
|
51
|
-
*/
|
52
|
-
matchesFor: function(url) {
|
53
|
-
if (!this.recognises(url)) {return false;};
|
54
|
-
|
55
|
-
var parameters = {};
|
56
|
-
|
57
|
-
var keys = this.paramsInMatchString;
|
58
|
-
var values = url.match(this.matcherRegex);
|
59
|
-
values.shift(); //first value is the entire match so reject
|
60
|
-
|
61
|
-
for (var i = keys.length - 1; i >= 0; i--){
|
62
|
-
parameters[keys[i].replace(":", "")] = values[i];
|
63
|
-
};
|
64
|
-
|
65
|
-
//add any additional parameter options specified in the route definition
|
66
|
-
for (option in this.options) {
|
67
|
-
parameters[option] = this.options[option];
|
68
|
-
}
|
69
|
-
|
70
|
-
return parameters;
|
71
|
-
},
|
72
|
-
|
73
|
-
urlForNamed: function(options) {
|
74
|
-
var options = options || {};
|
75
|
-
|
76
|
-
return this.urlFor(Ext.applyIf(options, this.options));
|
77
|
-
},
|
78
|
-
|
79
|
-
/**
|
80
|
-
* Attempts to build a url with this route, swapping the placeholders with properties of the options hash
|
81
|
-
*/
|
82
|
-
urlFor: function(options) {
|
83
|
-
var url = this.mappingString;
|
84
|
-
|
85
|
-
for (var o in options) {
|
86
|
-
//values in options must match this.options - e.g. this.options.action must be the same as options.action
|
87
|
-
if (options[o] && this.options[o] && options[o] != this.options[o]) { return false; }
|
88
|
-
}
|
89
|
-
|
90
|
-
|
91
|
-
//TODO: Tidy this up. All of it
|
92
|
-
|
93
|
-
var paramsInOptions = [];
|
94
|
-
for (var o in options) {
|
95
|
-
paramsInOptions.push(":" + o);
|
96
|
-
}
|
97
|
-
|
98
|
-
paramsInOptions = paramsInOptions.sort();
|
99
|
-
var paramsInStringWithOptions = this.paramsInStringWithOptions.sort();
|
100
|
-
|
101
|
-
//make sure that all match elements in the url string are included. If not, return false
|
102
|
-
if (paramsInStringWithOptions.length != paramsInOptions.length) { return false; }
|
103
|
-
for (var i=0; i < paramsInOptions.length; i++) {
|
104
|
-
if (paramsInOptions[i] != paramsInStringWithOptions[i]) {
|
105
|
-
return false;
|
106
|
-
}
|
107
|
-
};
|
108
|
-
|
109
|
-
for (var o in options) {
|
110
|
-
url = url.replace(":" + o, options[o]);
|
111
|
-
}
|
112
|
-
|
113
|
-
return url;
|
114
|
-
},
|
115
|
-
|
116
|
-
/**
|
117
|
-
* Private: For a given string, replaces all substrings starting with a colon into
|
118
|
-
* a regex string that can match a url segment.
|
119
|
-
* e.g. :controller/:action => '^([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)$'
|
120
|
-
* If any conditions have been specified on this route, their regular expressions are used instead:
|
121
|
-
* :controller/:action/:id => '^([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)/([0-9]+)$'
|
122
|
-
* if conditions was set to {":id" =>/[0-9]+]/}
|
123
|
-
* @param {String} regex_string The string we want to turn into a matchable regex
|
124
|
-
* @return {String} The replaced string
|
125
|
-
*/
|
126
|
-
convertToUsableRegex: function(regex_string) {
|
127
|
-
var p = this.paramsInMatchString;
|
128
|
-
|
129
|
-
for (var i = p.length - 1; i >= 0; i--){
|
130
|
-
var cond = this.conditions[p[i]];
|
131
|
-
var matcher = String.format("({0})", cond || "[a-zA-Z0-9\_,]+");
|
132
|
-
|
133
|
-
regex_string = regex_string.replace(new RegExp(p[i]), matcher);
|
134
|
-
};
|
135
|
-
|
136
|
-
//we want to match the whole string, so include the anchors
|
137
|
-
return new RegExp("^" + regex_string + "$");
|
138
|
-
}
|
139
|
-
};
|
data/lib/src/lib/Router.js
DELETED
@@ -1,282 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @class ExtMVC.router.Router
|
3
|
-
* @extends Object
|
4
|
-
* TODO: [DOCS] Give a good description of the Router
|
5
|
-
*/
|
6
|
-
ExtMVC.router.Router = function() {};
|
7
|
-
|
8
|
-
ExtMVC.router.Router.prototype = {
|
9
|
-
|
10
|
-
/**
|
11
|
-
* @property mappings
|
12
|
-
* @type Array
|
13
|
-
* Readonly. Maintains the collection of defined routes
|
14
|
-
*/
|
15
|
-
mappings: [],
|
16
|
-
|
17
|
-
/**
|
18
|
-
* @property namedRoutes
|
19
|
-
* @type Object
|
20
|
-
* Readonly. Maintains the collection of named routes
|
21
|
-
*/
|
22
|
-
namedRoutes: {},
|
23
|
-
|
24
|
-
/**
|
25
|
-
* Adds a new route to the collection. Routes are given priority in the order they are added
|
26
|
-
* @param {String} re The regular expression-style string to match (e.g. ":controller/:action/:id")
|
27
|
-
* @param {Object} additional_params Any additional options which will be returned along with the match elements if the route matches
|
28
|
-
* @return {ExtMVC.router.Route} The newly created route object
|
29
|
-
*/
|
30
|
-
connect: function(re, additional_params) {
|
31
|
-
var route = new ExtMVC.router.Route(re, additional_params);
|
32
|
-
this.mappings.push(route);
|
33
|
-
|
34
|
-
return route;
|
35
|
-
},
|
36
|
-
|
37
|
-
/**
|
38
|
-
* Defines a named route. This is the same as using connect, but with the option to specify the route by name. e.g.:
|
39
|
-
* this.name('myRoute', 'my/custom/route/:id', {controller: 'myController', action: 'myAction'});
|
40
|
-
* this.urlFor('myRoute', {id: 100}); //returns 'my/custom/route/100'
|
41
|
-
* @param {String} routeName The string name to give this route
|
42
|
-
* @param {String} re The regular expression-style string to match (e.g. ":controller/:action/:id")
|
43
|
-
* @param {Object} additional_params Any additional options which will be returned along with the match elements if the route matches
|
44
|
-
*/
|
45
|
-
name: function(routeName, re, additional_params) {
|
46
|
-
this.namedRoutes[routeName] = this.connect(re, additional_params);
|
47
|
-
},
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Same as calling connect("", options) - connects the empty route string to a controller/action pair
|
51
|
-
* @params {Object} options An object containing at least a controller and optionally an action (which is otherwise defaulted to index)
|
52
|
-
*/
|
53
|
-
root: function(options) {
|
54
|
-
var options = options || {};
|
55
|
-
this.connect("", Ext.applyIf(options, { action: 'index' }));
|
56
|
-
},
|
57
|
-
|
58
|
-
/**
|
59
|
-
* Adds specific index, new, show and edit routes for this resource. e.g.:
|
60
|
-
* resources('videos') is equivalent to:
|
61
|
-
* name('videos_path', 'videos', {controller: 'videos', action: 'index'});
|
62
|
-
* name('new_video_path', 'videos/new', {controller: 'videos', action: 'new' });
|
63
|
-
* name('video_path', 'videos/:id', {controller: 'videos', action: 'show' });
|
64
|
-
* name('edit_video_path', 'videos/:id/edit', {controller: 'videos', action: 'edit' });
|
65
|
-
*
|
66
|
-
* You can pass a second parameter which is an options object, e.g.:
|
67
|
-
* resources('videos', {controller: 'myController', myKey: 'myValue'}) sets up the following:
|
68
|
-
* name('videos_path', 'videos', {controller: 'myController', myKey: 'myValue', action: 'index'});
|
69
|
-
* name('new_video_path', 'videos/new', {controller: 'myController', myKey: 'myValue', action: 'new' });
|
70
|
-
* name('video_path', 'videos/:id', {controller: 'myController', myKey: 'myValue', action: 'show' });
|
71
|
-
* name('edit_video_path', 'videos/:id/edit', {controller: 'myController', myKey: 'myValue', action: 'edit' });
|
72
|
-
*
|
73
|
-
* Also accepts a series of arguments - resources('videos', 'bookmarks', 'messages')
|
74
|
-
* is the same as calling resources with each
|
75
|
-
*
|
76
|
-
* Finally, this format is also accepted:
|
77
|
-
* resources('videos', 'bookmarks', 'messages', {controller: 'myController', myKey: 'myValue'})
|
78
|
-
* Which is equivalent to calling resources with each of the three strings in turn, each with the
|
79
|
-
* final argument passed as options
|
80
|
-
*/
|
81
|
-
resources: function(resource_name, options) {
|
82
|
-
//if we have been passed a bunch of strings, call resources with each
|
83
|
-
if (arguments[1] && typeof(arguments[1]) == 'string') {
|
84
|
-
var lastArg = arguments[arguments.length - 1];
|
85
|
-
|
86
|
-
var opts = (typeof(lastArg) == 'object') ? lastArg : {};
|
87
|
-
|
88
|
-
for (var i=0; i < arguments.length; i++) {
|
89
|
-
//don't call with the last argument if it is an object as this is a generic settings object
|
90
|
-
if (!(lastArg === arguments[i] && typeof(lastArg) == 'object')) {
|
91
|
-
this.resources(arguments[i], opts);
|
92
|
-
};
|
93
|
-
};
|
94
|
-
|
95
|
-
return;
|
96
|
-
};
|
97
|
-
|
98
|
-
//work out the named route names for index, show, new and edit actions
|
99
|
-
var indexName = String.format("{0}_path", resource_name.pluralize() );
|
100
|
-
var newName = String.format("new_{0}_path", resource_name.singularize());
|
101
|
-
var showName = String.format("{0}_path", resource_name.singularize());
|
102
|
-
var editName = String.format("edit_{0}_path", resource_name.singularize());
|
103
|
-
|
104
|
-
//add named routes for index, new, edit and show
|
105
|
-
this.name(indexName, resource_name, Ext.apply({}, {controller: resource_name, action: 'index'}));
|
106
|
-
this.name(newName, resource_name + '/new', Ext.apply({}, {controller: resource_name, action: 'new' }));
|
107
|
-
this.name(showName, resource_name + '/:id', Ext.apply({}, {controller: resource_name, action: 'show', conditions: {':id': "[0-9]+"}}));
|
108
|
-
this.name(editName, resource_name + '/:id/edit', Ext.apply({}, {controller: resource_name, action: 'edit', conditions: {':id': "[0-9]+"}}));
|
109
|
-
},
|
110
|
-
|
111
|
-
/**
|
112
|
-
* Given a hash containing at route segment options (e.g. {controller: 'index', action: 'welcome'}),
|
113
|
-
* attempts to generate a url and redirect to it using Ext.History.add.
|
114
|
-
* All arguments are passed through to this.urlFor()
|
115
|
-
* @param {Object} options An object containing url segment options (such as controller and action)
|
116
|
-
* @return {Boolean} True if a url was generated and redirected to
|
117
|
-
*/
|
118
|
-
redirectTo: function() {
|
119
|
-
var url = this.urlFor.apply(this, arguments);
|
120
|
-
if (url) {
|
121
|
-
Ext.History.add(url);
|
122
|
-
return true;
|
123
|
-
} else return false;
|
124
|
-
},
|
125
|
-
|
126
|
-
/**
|
127
|
-
* Constructs and returns a config object for a Ext.History based link to a given url spec. This does not create
|
128
|
-
* an Ext.Component, only a shortcut to its config. This is intended for use in quickly generating menu items
|
129
|
-
* @param {Object} urlOptions A standard url generation object, e.g. {controller: 'index', action: 'welcome'}
|
130
|
-
* @param {Object} linkOptions Options for the link itself, e.g. {text: 'My Link Text'}
|
131
|
-
* @return {Object} a constructed config object for the given parameters
|
132
|
-
*/
|
133
|
-
linkTo: function(urlOptions, linkOptions) {
|
134
|
-
var linkOptions = linkOptions || {};
|
135
|
-
|
136
|
-
var url = this.urlFor(urlOptions);
|
137
|
-
if (url) {
|
138
|
-
return Ext.applyIf(linkOptions, {
|
139
|
-
url: url,
|
140
|
-
cls: [urlOptions.controller, urlOptions.action, urlOptions.id].join("-").replace("--", "-").replace(/-$/, ""),
|
141
|
-
text: this.constructDefaultLinkToName(urlOptions, linkOptions),
|
142
|
-
handler: function() {Ext.History.add(url);}
|
143
|
-
});
|
144
|
-
} else throw new Error("No match for that url specification");
|
145
|
-
},
|
146
|
-
|
147
|
-
/**
|
148
|
-
* Attempts to create good link name for a given object containing action and controller. Override with your own
|
149
|
-
* function to create custom link names for your app
|
150
|
-
* @param {Object} urlOptions An object containing at least controller and action properties
|
151
|
-
* @param {Object} linkOptions An object of arbitrary options for the link, initially passed to linkTo. Not used
|
152
|
-
* in default implementation but could be useful when overriding this method
|
153
|
-
* @return {String} The best-guess link name for the given params.
|
154
|
-
*/
|
155
|
-
constructDefaultLinkToName: function(urlOptions, linkOptions) {
|
156
|
-
if (!urlOptions || !urlOptions.controller || !urlOptions.action) {return "";}
|
157
|
-
var linkOptions = linkOptions || {};
|
158
|
-
|
159
|
-
Ext.applyIf(linkOptions, {
|
160
|
-
singularName: urlOptions.controller.singularize()
|
161
|
-
});
|
162
|
-
|
163
|
-
var actionName = urlOptions.action.titleize();
|
164
|
-
if (actionName == 'Index') {
|
165
|
-
return "Show " + urlOptions.controller.titleize();
|
166
|
-
} else {
|
167
|
-
return actionName + " " + linkOptions.singularName.titleize();
|
168
|
-
}
|
169
|
-
},
|
170
|
-
|
171
|
-
/**
|
172
|
-
* @params {String} url The url to be matched by the Router. Router will match against
|
173
|
-
* all connected matchers in the order they were connected and return an object created
|
174
|
-
* by parsing the url with the first matching matcher as defined using the connect() method
|
175
|
-
* @returns {Object} Object of all matches to this url
|
176
|
-
*/
|
177
|
-
recognise: function(url) {
|
178
|
-
for (var i=0; i < this.mappings.length; i++) {
|
179
|
-
var m = this.mappings[i];
|
180
|
-
var match = m.matchesFor(url);
|
181
|
-
if (match) { return match; }
|
182
|
-
};
|
183
|
-
|
184
|
-
return false;
|
185
|
-
},
|
186
|
-
|
187
|
-
/**
|
188
|
-
* Takes an object of url generation options such as controller and action. Returns a generated url.
|
189
|
-
* For a url to be generated, all of these options must match the requirements of at least one route definition
|
190
|
-
* @param {Object/String} options An object containing url options, or a named route string.
|
191
|
-
* @param {Object} namedRouteOptions If using a named route, this object is passed as additional parameters. e.g:
|
192
|
-
* this.name('myRoute', 'my/custom/route/:id', {controller: 'myController', action: 'myAction'});
|
193
|
-
* this.urlFor('myRoute', {id: 100}); //returns 'my/custom/route/100'
|
194
|
-
* this.urlFor('myRoute', 100); //returns 'my/custom/route/100' - number argument assumed to be an ID
|
195
|
-
* this.urlFor('myRoute', modelObj); //returns 'my/custom/route/100' if modelObj is a model object where modelObj.data.id = 100
|
196
|
-
* @return {String} The generated url, or false if there was no match
|
197
|
-
*/
|
198
|
-
urlFor: function(options, namedRouteOptions) {
|
199
|
-
var route;
|
200
|
-
|
201
|
-
//named route
|
202
|
-
if (typeof(options) == 'string') {
|
203
|
-
if (route = this.namedRoutes[options]) {
|
204
|
-
var namedRouteOptions = namedRouteOptions || {};
|
205
|
-
|
206
|
-
//normalise named route options in case we're passed an integer
|
207
|
-
if (typeof(namedRouteOptions) == 'number') {
|
208
|
-
namedRouteOptions = {id: namedRouteOptions};
|
209
|
-
};
|
210
|
-
|
211
|
-
//normalise named route options in case we're passed a model instance
|
212
|
-
if (namedRouteOptions.data && namedRouteOptions.data.id) {
|
213
|
-
namedRouteOptions = {id: namedRouteOptions.data.id};
|
214
|
-
};
|
215
|
-
|
216
|
-
return route.urlForNamed(namedRouteOptions);
|
217
|
-
};
|
218
|
-
}
|
219
|
-
//non-named route
|
220
|
-
else {
|
221
|
-
for (var i=0; i < this.mappings.length; i++) {
|
222
|
-
route = this.mappings[i]; var u = route.urlFor(options);
|
223
|
-
if (u) { return u; }
|
224
|
-
};
|
225
|
-
};
|
226
|
-
|
227
|
-
//there were no matches so return false
|
228
|
-
return false;
|
229
|
-
},
|
230
|
-
|
231
|
-
/**
|
232
|
-
* Immediately redirects to the specified route.
|
233
|
-
* @param {String} route The route
|
234
|
-
*/
|
235
|
-
route: function(route) {
|
236
|
-
document.location.hash = route;
|
237
|
-
},
|
238
|
-
|
239
|
-
/**
|
240
|
-
* Creates a handler for redirecting to the specified route
|
241
|
-
* @param {String} route The route
|
242
|
-
* @return {Function} handler A function that redirects to the route
|
243
|
-
*/
|
244
|
-
handleRoute: function(url) {
|
245
|
-
return this.route.createDelegate(this, [url]);
|
246
|
-
},
|
247
|
-
|
248
|
-
//experimental...
|
249
|
-
withOptions: function(options, routes) {
|
250
|
-
var options = options || {};
|
251
|
-
|
252
|
-
var defaultScope = this;
|
253
|
-
var optionScope = {};
|
254
|
-
|
255
|
-
optionScope.prototype = this;
|
256
|
-
Ext.apply(optionScope, {
|
257
|
-
connect: function(re, additional_params) {
|
258
|
-
var additional_params = additional_params || {};
|
259
|
-
Ext.applyIf(additional_params, options);
|
260
|
-
|
261
|
-
defaultScope.connect.call(defaultScope, re, additional_params);
|
262
|
-
},
|
263
|
-
|
264
|
-
name: function(routeName, re, additional_params) {
|
265
|
-
var additional_params = additional_params || {};
|
266
|
-
Ext.applyIf(additional_params, options);
|
267
|
-
|
268
|
-
defaultScope.name.call(defaultScope, routeName, re, additional_params);
|
269
|
-
}
|
270
|
-
});
|
271
|
-
|
272
|
-
routes.call(this, optionScope);
|
273
|
-
}
|
274
|
-
};
|
275
|
-
|
276
|
-
/**
|
277
|
-
* Basic default routes. Redefine this method inside config/routes.js
|
278
|
-
*/
|
279
|
-
ExtMVC.router.Router.defineRoutes = function(map) {
|
280
|
-
map.connect(":controller/:action");
|
281
|
-
map.connect(":controller/:action/:id");
|
282
|
-
};
|
data/lib/src/lib/String.js
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @class String
|
3
|
-
* Extensions to the String class
|
4
|
-
**/
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Capitalizes a string (e.g. ("some test sentence").capitalize() == "Some test sentence")
|
8
|
-
* @return {String} The capitalized String
|
9
|
-
*/
|
10
|
-
String.prototype.capitalize = function() {
|
11
|
-
return this.charAt(0).toUpperCase() + this.substr(1).toLowerCase();
|
12
|
-
};
|
13
|
-
|
14
|
-
/**
|
15
|
-
* Puts the string in Title Case (e.g. ("some test sentence").titleize() == "Some Test Sentence")
|
16
|
-
* @return {String} The titleized String
|
17
|
-
*/
|
18
|
-
String.prototype.titleize = function() {
|
19
|
-
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
|
20
|
-
};
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Takes any string and de-underscores and uppercases it
|
24
|
-
* e.g. long_underscored_string => LongUnderscoredString
|
25
|
-
*/
|
26
|
-
String.prototype.camelize = function() {
|
27
|
-
return this.replace(/_/g, " ").titleize().replace(/ /g, "");
|
28
|
-
};
|
29
|
-
|
30
|
-
/**
|
31
|
-
* Underscores a string (e.g. (("SomeCamelizedString").underscore() == 'some_camelized_string',
|
32
|
-
* ("some normal string").underscore() == 'some_normal_string')
|
33
|
-
* @return {String} The underscored string
|
34
|
-
*/
|
35
|
-
String.prototype.underscore = function() {
|
36
|
-
return this.replace(/([A-Z])/g, "_$1").toLowerCase().replace(/ /g, "_").replace(/^_/, '');
|
37
|
-
};
|
38
|
-
|
39
|
-
/**
|
40
|
-
* Uses the Inflector to singularize itself (e.g. ("cats").singularize() == 'cat')
|
41
|
-
* @return {String} The singularized version of this string
|
42
|
-
*/
|
43
|
-
String.prototype.singularize = function() {
|
44
|
-
return ExtMVC.Inflector.singularize(this);
|
45
|
-
};
|
46
|
-
|
47
|
-
/**
|
48
|
-
* Uses the Inflector to pluralize itself (e.g. ("cat").pluralize() == 'cats')
|
49
|
-
* @return {String} The pluralized version of this string
|
50
|
-
*/
|
51
|
-
String.prototype.pluralize = function() {
|
52
|
-
return ExtMVC.Inflector.pluralize(this);
|
53
|
-
};
|
54
|
-
|
55
|
-
/**
|
56
|
-
* Attempts to humanize a name by replacing underscores with spaces. Mainly useful for Ext.Model.Base
|
57
|
-
* @return {String} The humanized string
|
58
|
-
*/
|
59
|
-
String.prototype.humanize = function() {
|
60
|
-
return this.underscore().replace(/_/g, " ");
|
61
|
-
};
|
62
|
-
|
63
|
-
/**
|
64
|
-
* Replaces instances of the strings &, >, < and " with their escaped versions
|
65
|
-
* @return {String} The escaped version of the original text
|
66
|
-
*/
|
67
|
-
String.prototype.escapeHTML = function () {
|
68
|
-
return this.replace(/&/g,'&').replace(/>/g,'>').replace(/</g,'<').replace(/"/g,'"');
|
69
|
-
};
|
70
|
-
|
71
|
-
/**
|
72
|
-
* Converts this string into a currency, prepended with the given currency symbol
|
73
|
-
* @param {String} symbol The currency symbol to use (defaults to $)
|
74
|
-
*/
|
75
|
-
String.prototype.toCurrency = function(symbol) {
|
76
|
-
if (typeof(symbol) == 'undefined') {var symbol = '$';}
|
77
|
-
|
78
|
-
var beforeDecimal = this.split(".")[0],
|
79
|
-
afterDecimal = this.split(".")[1];
|
80
|
-
|
81
|
-
var segmentCount = Math.floor(beforeDecimal.length / 3);
|
82
|
-
var firstSegmentWidth = beforeDecimal.length % 3,
|
83
|
-
pointerPosition = firstSegmentWidth;
|
84
|
-
|
85
|
-
var segments = firstSegmentWidth == 0 ? [] : [beforeDecimal.substr(0, firstSegmentWidth)];
|
86
|
-
|
87
|
-
for (var i=0; i < segmentCount; i++) {
|
88
|
-
segments.push(beforeDecimal.substr(firstSegmentWidth + (i * 3), 3));
|
89
|
-
};
|
90
|
-
|
91
|
-
beforeDecimal = symbol + segments.join(",");
|
92
|
-
|
93
|
-
return afterDecimal ? String.format("{0}.{1}", beforeDecimal, afterDecimal) : beforeDecimal;
|
94
|
-
};
|