ember-big_project 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +208 -0
- data/Rakefile +1 -0
- data/ember-big_project.gemspec +25 -0
- data/lib/ember/big_project.rb +7 -0
- data/lib/ember/big_project/version.rb +5 -0
- data/lib/generators/ember_proj/bootstrap_generator.rb +291 -0
- data/lib/generators/ember_proj/gem_helper.rb +48 -0
- data/lib/generators/ember_proj/templates/app/app_loader.js.coffee +16 -0
- data/lib/generators/ember_proj/templates/app/authentication.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/config.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/config/app.js.coffee +0 -0
- data/lib/generators/ember_proj/templates/app/config/display.js.coffee +0 -0
- data/lib/generators/ember_proj/templates/app/config/logging.js.coffee +0 -0
- data/lib/generators/ember_proj/templates/app/controllers.js.coffee +3 -0
- data/lib/generators/ember_proj/templates/app/helpers.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/lib.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/mixins.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/models.js.coffee +3 -0
- data/lib/generators/ember_proj/templates/app/routes.js.coffee +4 -0
- data/lib/generators/ember_proj/templates/app/state_managers.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/stores.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/templates.js.coffee +1 -0
- data/lib/generators/ember_proj/templates/app/views.js.coffee +3 -0
- data/lib/generators/ember_proj/templates/application.js.coffee +20 -0
- data/vendor/assets/javascripts/ember-data-validations.js +68 -0
- data/vendor/assets/javascripts/ember-easyForm.js +290 -0
- data/vendor/assets/javascripts/ember-formBuilder.js +32 -0
- data/vendor/assets/javascripts/ember-validations.js +581 -0
- metadata +118 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
module EmberProj
|
2
|
+
module GemHelper
|
3
|
+
def bundle_gems!
|
4
|
+
bundle_command 'install'
|
5
|
+
end
|
6
|
+
|
7
|
+
# File railties/lib/rails/generators/app_base.rb, line 241
|
8
|
+
def bundle_command(command)
|
9
|
+
say_status :run, "bundle #{command}"
|
10
|
+
|
11
|
+
# We are going to shell out rather than invoking Bundler::CLI.new(command)
|
12
|
+
# because `rails new` loads the Thor gem and on the other hand bundler uses
|
13
|
+
# its own vendored Thor, which could be a different version. Running both
|
14
|
+
# things in the same process is a recipe for a night with paracetamol.
|
15
|
+
#
|
16
|
+
# We use backticks and #print here instead of vanilla #system because it
|
17
|
+
# is easier to silence stdout in the existing test suite this way. The
|
18
|
+
# end-user gets the bundler commands called anyway, so no big deal.
|
19
|
+
#
|
20
|
+
# Thanks to James Tucker for the Gem tricks involved in this call.
|
21
|
+
print %x[#{Gem.ruby} -rubygems "#{ruby_gems}" #{command}]
|
22
|
+
end
|
23
|
+
|
24
|
+
def ruby_gems
|
25
|
+
Gem.bin_path('bundler', 'bundle')
|
26
|
+
end
|
27
|
+
|
28
|
+
def has_any_gem? *names
|
29
|
+
names.flatten.any? {|name| has_gem? name }
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_all_gems? *names
|
33
|
+
names.flatten.all? {|name| has_gem? name }
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_gem? name
|
37
|
+
gemfile_content =~ /gem\s+('|")#{name}/
|
38
|
+
end
|
39
|
+
|
40
|
+
def gemfile_content
|
41
|
+
@gemfile_content ||= gemfile.read
|
42
|
+
end
|
43
|
+
|
44
|
+
def gemfile
|
45
|
+
@gemfile ||= File.open Rails.root.join('Gemfile'), 'r'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#= require_self
|
2
|
+
|
3
|
+
#= require_tree lib
|
4
|
+
#= require_tree mixins
|
5
|
+
#= require_tree helpers
|
6
|
+
#= require_tree config
|
7
|
+
|
8
|
+
#= require stores
|
9
|
+
#= require models
|
10
|
+
#= require controllers
|
11
|
+
#= require views
|
12
|
+
#= require templates
|
13
|
+
|
14
|
+
#= require state_managers
|
15
|
+
#= require authentication
|
16
|
+
#= require router
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree authentication
|
@@ -0,0 +1 @@
|
|
1
|
+
# require_tree config
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree helpers
|
@@ -0,0 +1 @@
|
|
1
|
+
# require_tree lib
|
@@ -0,0 +1 @@
|
|
1
|
+
# require_tree mixins
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree state_managers
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree stores
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree templates
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#= require modernizr
|
2
|
+
#= require jquery
|
3
|
+
#= require handlebars
|
4
|
+
#= require ruby
|
5
|
+
#= require ember
|
6
|
+
#= require ember-data
|
7
|
+
#= require ember-data-validations
|
8
|
+
#= require ember-formBuilder
|
9
|
+
#= require bootstrap
|
10
|
+
|
11
|
+
#= require app/app_loader
|
12
|
+
|
13
|
+
#= require rails.validations
|
14
|
+
#= require rails.validations.ember
|
15
|
+
|
16
|
+
window.App = Ember.Application.create LOG_TRANSITIONS: true
|
17
|
+
|
18
|
+
# Defer App readiness until it should be advanced for either
|
19
|
+
# testing or production.
|
20
|
+
App.deferReadiness()
|
@@ -0,0 +1,68 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
|
3
|
+
DS.DefaultValidators = {
|
4
|
+
required: function (value, meta) {
|
5
|
+
if (meta.options.required == true) {
|
6
|
+
if (!value || 0 === value.length) {
|
7
|
+
return "'%@' attribute is required".fmt(meta.name);
|
8
|
+
}
|
9
|
+
} else return '';
|
10
|
+
}
|
11
|
+
};
|
12
|
+
|
13
|
+
DS.Validation = Ember.Object.create({
|
14
|
+
init: function () {
|
15
|
+
var defaults = DS.DefaultValidators;
|
16
|
+
this.validators = [];
|
17
|
+
for (var validator in defaults) {
|
18
|
+
if (defaults.hasOwnProperty(validator)) {
|
19
|
+
this.validators.push(defaults[validator]);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
},
|
23
|
+
register: function (validator) {
|
24
|
+
this.validators.push(validator);
|
25
|
+
},
|
26
|
+
validate: function (value, meta) {
|
27
|
+
var length = this.validators.length;
|
28
|
+
for (var i = 0; i < length; i++) {
|
29
|
+
var validator = this.validators[i];
|
30
|
+
var error = validator(value, meta);
|
31
|
+
if (error) return error;
|
32
|
+
}
|
33
|
+
return '';
|
34
|
+
}
|
35
|
+
});
|
36
|
+
|
37
|
+
DS.Model.reopen({
|
38
|
+
staleValidation: false,
|
39
|
+
|
40
|
+
validateProperty: function (name) {
|
41
|
+
var meta = get(this.constructor, 'attributes').get(name);
|
42
|
+
var value = get(this, name);
|
43
|
+
var error = DS.Validation.validate(value, meta);
|
44
|
+
if (error) {
|
45
|
+
this.errors = this.errors || {};
|
46
|
+
this.errors[name] = error;
|
47
|
+
}
|
48
|
+
return error;
|
49
|
+
},
|
50
|
+
|
51
|
+
validate: function () {
|
52
|
+
this.eachAttribute(function (name) {
|
53
|
+
this.validateProperty(name);
|
54
|
+
}, this);
|
55
|
+
return this.errors;
|
56
|
+
},
|
57
|
+
|
58
|
+
didChangeState: function () {
|
59
|
+
var state = get(this, 'stateManager.currentState');
|
60
|
+
if (state.name == 'uncommitted') {
|
61
|
+
if (state.parentState.name == 'updated') {
|
62
|
+
if (this.validate()) {
|
63
|
+
this.send('becameInvalid');
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}.observes('stateManager.currentPath')
|
68
|
+
});
|
@@ -0,0 +1,290 @@
|
|
1
|
+
// Last commit: 16f3486 (2013-03-04 21:19:48 -0500)
|
2
|
+
|
3
|
+
|
4
|
+
(function() {
|
5
|
+
Ember.EasyForm = Ember.Namespace.create({
|
6
|
+
VERSION: '0.3.0'
|
7
|
+
});
|
8
|
+
|
9
|
+
})();
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
(function() {
|
14
|
+
Ember.Handlebars.registerHelper('errorField', function(property, options) {
|
15
|
+
if (this.get('errors')) {
|
16
|
+
options.hash.property = property;
|
17
|
+
return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Error, options);
|
18
|
+
}
|
19
|
+
});
|
20
|
+
|
21
|
+
})();
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
(function() {
|
26
|
+
Ember.Handlebars.registerBoundHelper('formFor', function(object, options) {
|
27
|
+
return Ember.Handlebars.helpers.view.call(object, Ember.EasyForm.Form, options);
|
28
|
+
});
|
29
|
+
|
30
|
+
})();
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
(function() {
|
35
|
+
Ember.Handlebars.registerHelper('input', function(property, options) {
|
36
|
+
options.hash.inputOptions = Ember.copy(options.hash);
|
37
|
+
options.hash.property = property;
|
38
|
+
options.hash.isBlock = !!(options.fn);
|
39
|
+
return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Input, options);
|
40
|
+
});
|
41
|
+
|
42
|
+
})();
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
(function() {
|
47
|
+
Ember.Handlebars.registerHelper('inputField', function(property, options) {
|
48
|
+
var context = this,
|
49
|
+
propertyType = function(property) {
|
50
|
+
try {
|
51
|
+
return context.constructor.metaForProperty(property);
|
52
|
+
} catch(e) {
|
53
|
+
return null;
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
options.hash.valueBinding = property;
|
58
|
+
|
59
|
+
if (options.hash.as === 'text') {
|
60
|
+
return Ember.Handlebars.helpers.view.call(context, Ember.TextArea, options);
|
61
|
+
} else {
|
62
|
+
if (!options.hash.type) {
|
63
|
+
if (property.match(/password/)) {
|
64
|
+
options.hash.type = 'password';
|
65
|
+
} else if (property.match(/email/)) {
|
66
|
+
options.hash.type = 'email';
|
67
|
+
} else {
|
68
|
+
if (propertyType(context, property) === 'number' || typeof(context.get(property)) === 'number') {
|
69
|
+
options.hash.type = 'number';
|
70
|
+
} else if (propertyType(context, property) === 'date' || (context.get(property) !== undefined && context.get(property).constructor === Date)) {
|
71
|
+
options.hash.type = 'date';
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
return Ember.Handlebars.helpers.view.call(context, Ember.TextField, options);
|
76
|
+
}
|
77
|
+
});
|
78
|
+
|
79
|
+
})();
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
(function() {
|
84
|
+
Ember.Handlebars.registerHelper('labelField', function(property, options) {
|
85
|
+
options.hash.property = property;
|
86
|
+
return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Label, options);
|
87
|
+
});
|
88
|
+
|
89
|
+
})();
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
(function() {
|
94
|
+
Ember.Handlebars.registerHelper('submit', function(value, options) {
|
95
|
+
if (typeof(value) === 'object') {
|
96
|
+
options = value;
|
97
|
+
value = undefined;
|
98
|
+
}
|
99
|
+
options.hash.context = this;
|
100
|
+
options.hash.value = value || 'Submit';
|
101
|
+
return Ember.Handlebars.helpers.view.call(this, Ember.EasyForm.Submit, options);
|
102
|
+
});
|
103
|
+
|
104
|
+
})();
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
(function() {
|
109
|
+
|
110
|
+
})();
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
(function() {
|
115
|
+
Ember.EasyForm.Error = Ember.View.extend({
|
116
|
+
tagName: 'span',
|
117
|
+
classNames: ['error'],
|
118
|
+
init: function() {
|
119
|
+
var watchFunc;
|
120
|
+
this._super();
|
121
|
+
|
122
|
+
// TODO: un-fuglify this
|
123
|
+
watchFunc = {};
|
124
|
+
watchFunc[''+this.property+'Watch'] = function() {
|
125
|
+
if (typeof(this.get('controller.errors.'+this.property)) === 'string') {
|
126
|
+
return (this.get('controller.errors.'+this.property));
|
127
|
+
} else {
|
128
|
+
return (this.get('controller.errors.'+this.property) || [])[0];
|
129
|
+
}
|
130
|
+
}.property('controller.content.errors.'+this.property);
|
131
|
+
this.reopen(watchFunc);
|
132
|
+
|
133
|
+
this.set('template', Ember.Handlebars.compile('{{view.'+this.property+'Watch}}'));
|
134
|
+
}
|
135
|
+
});
|
136
|
+
|
137
|
+
})();
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
(function() {
|
142
|
+
Ember.EasyForm.Form = Ember.View.extend({
|
143
|
+
tagName: 'form',
|
144
|
+
attributeBindings: ['novalidate'],
|
145
|
+
novalidate: 'novalidate',
|
146
|
+
submit: function(event) {
|
147
|
+
var object = this.get('context').get('content'), _this = this;
|
148
|
+
|
149
|
+
if (event) {
|
150
|
+
event.preventDefault();
|
151
|
+
}
|
152
|
+
|
153
|
+
if (object.validate === undefined) {
|
154
|
+
this.get('controller').send('submit');
|
155
|
+
} else {
|
156
|
+
object.validate().then(function() {
|
157
|
+
if (object.get('isValid') === true) {
|
158
|
+
_this.get('controller').send('submit');
|
159
|
+
}
|
160
|
+
});
|
161
|
+
}
|
162
|
+
}
|
163
|
+
});
|
164
|
+
|
165
|
+
})();
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
(function() {
|
170
|
+
Ember.EasyForm.Input = Ember.View.extend({
|
171
|
+
init: function() {
|
172
|
+
this._super();
|
173
|
+
if (!this.isBlock) {
|
174
|
+
this.set('template', Ember.Handlebars.compile(this.fieldsForInput()));
|
175
|
+
}
|
176
|
+
if(this.get('context').get('errors') !== undefined) {
|
177
|
+
this.reopen({
|
178
|
+
error: function() {
|
179
|
+
return this.get('context').get('errors').get(this.property) !== undefined;
|
180
|
+
}.property('context.errors.'+this.property)
|
181
|
+
});
|
182
|
+
}
|
183
|
+
},
|
184
|
+
tagName: 'div',
|
185
|
+
classNames: ['input', 'string'],
|
186
|
+
classNameBindings: ['error:fieldWithErrors'],
|
187
|
+
fieldsForInput: function() {
|
188
|
+
return this.labelField()+this.inputField()+this.errorField();
|
189
|
+
},
|
190
|
+
labelField: function() {
|
191
|
+
var options = this.label ? 'text="'+this.label+'"' : '';
|
192
|
+
return '{{labelField '+this.property+' '+options+'}}';
|
193
|
+
},
|
194
|
+
inputField: function() {
|
195
|
+
var options = '', key, inputOptions = ['type', 'placeholder'];
|
196
|
+
for (var i = 0; i < inputOptions.length; i++) {
|
197
|
+
key = inputOptions[i];
|
198
|
+
if (this[key]) {
|
199
|
+
if (typeof(this[key]) === 'boolean') {
|
200
|
+
this[key] = key;
|
201
|
+
}
|
202
|
+
options = options.concat(''+key+'="'+this[inputOptions[i]]+'"');
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
206
|
+
options.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
207
|
+
|
208
|
+
return '{{inputField '+this.property+' '+options+'}}';
|
209
|
+
},
|
210
|
+
errorField: function() {
|
211
|
+
var options = '';
|
212
|
+
return '{{errorField '+this.property+' '+options+'}}';
|
213
|
+
},
|
214
|
+
focusOut: function() {
|
215
|
+
if (this.get('context').get('content').validate) {
|
216
|
+
this.get('context').get('content').validate(this.property);
|
217
|
+
}
|
218
|
+
}
|
219
|
+
});
|
220
|
+
|
221
|
+
})();
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
(function() {
|
226
|
+
Ember.EasyForm.Label = Ember.View.extend({
|
227
|
+
tagName: 'label',
|
228
|
+
init: function() {
|
229
|
+
this.set('template', this.renderText());
|
230
|
+
},
|
231
|
+
renderText: function() {
|
232
|
+
return Ember.Handlebars.compile(this.text || this.property.underscore().split('_').join(' ').capitalize());
|
233
|
+
}
|
234
|
+
});
|
235
|
+
|
236
|
+
})();
|
237
|
+
|
238
|
+
|
239
|
+
|
240
|
+
(function() {
|
241
|
+
Ember.EasyForm.Submit = Ember.View.extend({
|
242
|
+
tagName: 'input',
|
243
|
+
attributeBindings: ['type', 'value'],
|
244
|
+
type: 'submit',
|
245
|
+
init: function() {
|
246
|
+
this.set('value', this.value);
|
247
|
+
},
|
248
|
+
onClick: function() {
|
249
|
+
if (this.get('context').validate()) {
|
250
|
+
this.get('controller').send('submit');
|
251
|
+
}
|
252
|
+
}
|
253
|
+
});
|
254
|
+
|
255
|
+
})();
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
(function() {
|
260
|
+
|
261
|
+
})();
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
(function() {
|
266
|
+
Ember.TEMPLATES['easyForm/input'] = Ember.Handlebars.compile('<label {{bindAttr for="labelFor"}}>{{labelText}}</label>');
|
267
|
+
|
268
|
+
})();
|
269
|
+
|
270
|
+
|
271
|
+
|
272
|
+
(function() {
|
273
|
+
|
274
|
+
})();
|
275
|
+
|
276
|
+
|
277
|
+
|
278
|
+
(function() {
|
279
|
+
Ember.EasyForm.objectNameFor = function(object) {
|
280
|
+
var constructorArray = object.constructor.toString().split('.');
|
281
|
+
return constructorArray[constructorArray.length - 1].underscore();
|
282
|
+
};
|
283
|
+
|
284
|
+
})();
|
285
|
+
|
286
|
+
|
287
|
+
|
288
|
+
(function() {
|
289
|
+
|
290
|
+
})();
|