spine-rails 0.0.7 → 0.0.8
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/README.md +2 -2
- data/app/assets/javascripts/spine.js +21 -4
- data/app/assets/javascripts/spine/ajax.js +1 -1
- data/app/assets/javascripts/spine/manager.js +43 -0
- data/app/assets/javascripts/spine/route.js +1 -1
- data/app/assets/javascripts/spine/tabs.js +9 -9
- data/lib/generators/spine/controller/controller_generator.rb +1 -1
- data/lib/generators/spine/model/model_generator.rb +1 -1
- data/lib/generators/spine/new/new_generator.rb +1 -1
- data/lib/generators/spine/scaffold/scaffold_generator.rb +42 -0
- data/lib/generators/spine/scaffold/templates/controller.coffee.erb +110 -0
- data/lib/generators/spine/scaffold/templates/edit.jst.erb +15 -0
- data/lib/generators/spine/scaffold/templates/index.jst.erb +12 -0
- data/lib/generators/spine/scaffold/templates/new.jst.erb +15 -0
- data/lib/generators/spine/scaffold/templates/show.jst.erb +7 -0
- data/lib/spine/generators.rb +11 -9
- data/lib/spine/rails/version.rb +1 -1
- metadata +13 -6
data/README.md
CHANGED
@@ -31,7 +31,7 @@ Running `rails g spine:new` will create the following directory structure:
|
|
31
31
|
app/assets/javascripts/app/models/
|
32
32
|
app/assets/javascripts/app/views/
|
33
33
|
app/assets/javascripts/app/controllers/
|
34
|
-
app/assets/javascripts/app/index.coffee
|
34
|
+
app/assets/javascripts/app/index.js.coffee
|
35
35
|
|
36
36
|
By default your application will be namespaced by the `app` directory. You can specify a different namespace with the `--app` option:
|
37
37
|
|
@@ -39,7 +39,7 @@ By default your application will be namespaced by the `app` directory. You can s
|
|
39
39
|
|
40
40
|
**NOTE:** If you use the `--app` option here, then you will also have to specify it with other generators.
|
41
41
|
|
42
|
-
Use the top-level level `index.coffee` file to setup namespacing and initial controller instantiation.
|
42
|
+
Use the top-level level `index.js.coffee` file to setup namespacing and initial controller instantiation.
|
43
43
|
|
44
44
|
## Generators
|
45
45
|
|
@@ -328,6 +328,10 @@
|
|
328
328
|
return new this(objects);
|
329
329
|
}
|
330
330
|
};
|
331
|
+
Model.fromForm = function() {
|
332
|
+
var _ref;
|
333
|
+
return (_ref = new this).fromForm.apply(_ref, arguments);
|
334
|
+
};
|
331
335
|
Model.recordsValues = function() {
|
332
336
|
var key, result, value, _ref;
|
333
337
|
result = [];
|
@@ -363,13 +367,16 @@
|
|
363
367
|
};
|
364
368
|
Model.prototype.validate = function() {};
|
365
369
|
Model.prototype.load = function(atts) {
|
366
|
-
var key, value
|
367
|
-
_results = [];
|
370
|
+
var key, value;
|
368
371
|
for (key in atts) {
|
369
372
|
value = atts[key];
|
370
|
-
|
373
|
+
if (typeof this[key] === 'function') {
|
374
|
+
this[key](value);
|
375
|
+
} else {
|
376
|
+
this[key] = value;
|
377
|
+
}
|
371
378
|
}
|
372
|
-
return
|
379
|
+
return this;
|
373
380
|
};
|
374
381
|
Model.prototype.attributes = function() {
|
375
382
|
var key, result, _i, _len, _ref;
|
@@ -460,6 +467,16 @@
|
|
460
467
|
Model.prototype.toString = function() {
|
461
468
|
return "<" + this.constructor.className + " (" + (JSON.stringify(this)) + ")>";
|
462
469
|
};
|
470
|
+
Model.prototype.fromForm = function(form) {
|
471
|
+
var key, result, _i, _len, _ref;
|
472
|
+
result = {};
|
473
|
+
_ref = $(form).serializeArray();
|
474
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
475
|
+
key = _ref[_i];
|
476
|
+
result[key.name] = key.value;
|
477
|
+
}
|
478
|
+
return this.load(result);
|
479
|
+
};
|
463
480
|
Model.prototype.exists = function() {
|
464
481
|
return this.id && this.id in this.constructor.records;
|
465
482
|
};
|
@@ -81,6 +81,49 @@
|
|
81
81
|
return this;
|
82
82
|
}
|
83
83
|
});
|
84
|
+
Spine.Stack = (function() {
|
85
|
+
__extends(Stack, Spine.Controller);
|
86
|
+
Stack.prototype.controllers = {};
|
87
|
+
Stack.prototype.routes = {};
|
88
|
+
Stack.prototype.className = 'spine stack';
|
89
|
+
function Stack() {
|
90
|
+
var key, value, _fn, _ref, _ref2;
|
91
|
+
Stack.__super__.constructor.apply(this, arguments);
|
92
|
+
this.manager = new Spine.Manager;
|
93
|
+
_ref = this.controllers;
|
94
|
+
for (key in _ref) {
|
95
|
+
value = _ref[key];
|
96
|
+
this[key] = new value({
|
97
|
+
stack: this
|
98
|
+
});
|
99
|
+
this.add(this[key]);
|
100
|
+
}
|
101
|
+
_ref2 = this.routes;
|
102
|
+
_fn = __bind(function(key, value) {
|
103
|
+
var callback;
|
104
|
+
if (typeof value === 'function') {
|
105
|
+
callback = value;
|
106
|
+
}
|
107
|
+
callback || (callback = __bind(function() {
|
108
|
+
var _ref3;
|
109
|
+
return (_ref3 = this[value]).active.apply(_ref3, arguments);
|
110
|
+
}, this));
|
111
|
+
return this.route(key, callback);
|
112
|
+
}, this);
|
113
|
+
for (key in _ref2) {
|
114
|
+
value = _ref2[key];
|
115
|
+
_fn(key, value);
|
116
|
+
}
|
117
|
+
if (this["default"]) {
|
118
|
+
this[this["default"]].active();
|
119
|
+
}
|
120
|
+
}
|
121
|
+
Stack.prototype.add = function(controller) {
|
122
|
+
this.manager.add(controller);
|
123
|
+
return this.append(controller);
|
124
|
+
};
|
125
|
+
return Stack;
|
126
|
+
})();
|
84
127
|
if (typeof module !== "undefined" && module !== null) {
|
85
128
|
module.exports = Spine.Manager;
|
86
129
|
}
|
@@ -15,24 +15,24 @@
|
|
15
15
|
Spine.Tabs = (function() {
|
16
16
|
__extends(Tabs, Spine.Controller);
|
17
17
|
Tabs.prototype.events = {
|
18
|
-
|
18
|
+
'click [data-name]': 'click'
|
19
19
|
};
|
20
20
|
function Tabs() {
|
21
21
|
this.change = __bind(this.change, this); Tabs.__super__.constructor.apply(this, arguments);
|
22
|
-
this.bind(
|
22
|
+
this.bind('change', this.change);
|
23
23
|
}
|
24
24
|
Tabs.prototype.change = function(name) {
|
25
25
|
if (!name) {
|
26
26
|
return;
|
27
27
|
}
|
28
28
|
this.current = name;
|
29
|
-
this.children().removeClass(
|
30
|
-
return this.children("[data-name=
|
29
|
+
this.children().removeClass('active');
|
30
|
+
return this.children("[data-name=" + this.current).addClass('active');
|
31
31
|
};
|
32
32
|
Tabs.prototype.render = function() {
|
33
33
|
this.change(this.current);
|
34
|
-
if (!(this.children(
|
35
|
-
return this.children(
|
34
|
+
if (!(this.children('.active').length || this.current)) {
|
35
|
+
return this.children(':first').click();
|
36
36
|
}
|
37
37
|
};
|
38
38
|
Tabs.prototype.children = function(sel) {
|
@@ -40,11 +40,11 @@
|
|
40
40
|
};
|
41
41
|
Tabs.prototype.click = function(e) {
|
42
42
|
var name;
|
43
|
-
name = $(e.target).attr(
|
44
|
-
return this.trigger(
|
43
|
+
name = $(e.target).attr('data-name');
|
44
|
+
return this.trigger('change', name);
|
45
45
|
};
|
46
46
|
Tabs.prototype.connect = function(tabName, controller) {
|
47
|
-
return this.bind(
|
47
|
+
return this.bind('change', function(name) {
|
48
48
|
if (name === tabName) {
|
49
49
|
return controller.active();
|
50
50
|
}
|
@@ -10,7 +10,7 @@ module Spine
|
|
10
10
|
argument :fields, :desc => 'List of model attributes', :type => :array, :banner => 'field1 field2'
|
11
11
|
|
12
12
|
def create_model
|
13
|
-
template "model.coffee.erb", "app/assets/javascripts/#{app_name}/models/#{file_name}.coffee"
|
13
|
+
template "model.coffee.erb", "app/assets/javascripts/#{app_name}/models/#{file_name}.js.coffee"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "spine/generators"
|
3
|
+
|
4
|
+
module Spine
|
5
|
+
module Generators
|
6
|
+
class ScaffoldGenerator < Base
|
7
|
+
source_root File.expand_path("../templates", __FILE__)
|
8
|
+
desc "Generate a Spine scaffold with configured fields"
|
9
|
+
|
10
|
+
argument :fields, :desc => "List of model attributes", :type => :array, :banner => "field1 field2"
|
11
|
+
|
12
|
+
def create_scaffold
|
13
|
+
raise("The 'eco' gem is required; add it to the Gemfile") unless defined?(::Eco)
|
14
|
+
|
15
|
+
generate "spine:model #{model_name} #{fields.join(" ")} --app #{app_name}"
|
16
|
+
template "controller.coffee.erb", "app/assets/javascripts/#{app_name}/controllers/#{controller_name}.js.coffee"
|
17
|
+
template "edit.jst.erb", "app/assets/javascripts/#{app_name}/views/#{controller_name}/edit.jst.eco"
|
18
|
+
template "index.jst.erb", "app/assets/javascripts/#{app_name}/views/#{controller_name}/index.jst.eco"
|
19
|
+
template "new.jst.erb", "app/assets/javascripts/#{app_name}/views/#{controller_name}/new.jst.eco"
|
20
|
+
template "show.jst.erb", "app/assets/javascripts/#{app_name}/views/#{controller_name}/show.jst.eco"
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def model_name
|
26
|
+
file_name.singularize
|
27
|
+
end
|
28
|
+
|
29
|
+
def model_class
|
30
|
+
class_name.singularize
|
31
|
+
end
|
32
|
+
|
33
|
+
def controller_name
|
34
|
+
file_name.pluralize
|
35
|
+
end
|
36
|
+
|
37
|
+
def controller_class
|
38
|
+
class_name.pluralize
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
$ = jQuery.sub()
|
2
|
+
<%= model_class %> = <%= app_class %>.<%= model_class %>
|
3
|
+
|
4
|
+
$.fn.item = ->
|
5
|
+
elementID = $(@).data('id')
|
6
|
+
elementID or= $(@).parents('[data-id]').data('id')
|
7
|
+
<%= model_class %>.find(elementID)
|
8
|
+
|
9
|
+
class New extends Spine.Controller
|
10
|
+
events:
|
11
|
+
'submit form': 'submit'
|
12
|
+
|
13
|
+
constructor: ->
|
14
|
+
super
|
15
|
+
@active @render
|
16
|
+
|
17
|
+
render: ->
|
18
|
+
@html App.view('<%= controller_name %>/new')
|
19
|
+
|
20
|
+
submit: (e) ->
|
21
|
+
e.preventDefault()
|
22
|
+
<%= model_name %> = <%= model_class %>.fromForm(e.target).save()
|
23
|
+
@navigate '/<%= controller_name %>', <%= model_name %>.id if <%= model_name %>
|
24
|
+
|
25
|
+
class Edit extends Spine.Controller
|
26
|
+
events:
|
27
|
+
'submit form': 'submit'
|
28
|
+
|
29
|
+
constructor: ->
|
30
|
+
super
|
31
|
+
@active (params) ->
|
32
|
+
@change(params.id)
|
33
|
+
|
34
|
+
change: (id) ->
|
35
|
+
@item = <%= model_class %>.find(id)
|
36
|
+
@render()
|
37
|
+
|
38
|
+
render: ->
|
39
|
+
@html App.view('<%= controller_name %>/edit')(@item)
|
40
|
+
|
41
|
+
submit: (e) ->
|
42
|
+
e.preventDefault()
|
43
|
+
@item.fromForm(e.target).save()
|
44
|
+
@navigate '/<%= controller_name %>'
|
45
|
+
|
46
|
+
class Show extends Spine.Controller
|
47
|
+
events:
|
48
|
+
'click [data-type=back]': 'back'
|
49
|
+
|
50
|
+
constructor: ->
|
51
|
+
super
|
52
|
+
@active (params) ->
|
53
|
+
@change(params.id)
|
54
|
+
|
55
|
+
change: (id) ->
|
56
|
+
@item = <%= model_class %>.find(id)
|
57
|
+
@render()
|
58
|
+
|
59
|
+
render: ->
|
60
|
+
@html App.view('<%= controller_name %>/show')(@item)
|
61
|
+
|
62
|
+
back: ->
|
63
|
+
@navigate '/<%= controller_name %>'
|
64
|
+
|
65
|
+
class Index extends Spine.Controller
|
66
|
+
events:
|
67
|
+
'click [data-type=edit]': 'edit'
|
68
|
+
'click [data-type=destroy]': 'destroy'
|
69
|
+
'click [data-type=show]': 'show'
|
70
|
+
'click [data-type=new]': 'new'
|
71
|
+
|
72
|
+
constructor: ->
|
73
|
+
super
|
74
|
+
<%= model_class %>.bind 'refresh change', @render
|
75
|
+
<%= model_class %>.fetch()
|
76
|
+
|
77
|
+
render: =>
|
78
|
+
<%= controller_name %> = <%= model_class %>.all()
|
79
|
+
@html App.view('<%= controller_name %>/index')(<%= controller_name %>: <%= controller_name %>)
|
80
|
+
|
81
|
+
edit: (e) ->
|
82
|
+
item = $(e.target).item()
|
83
|
+
@navigate '/<%= controller_name %>', item.id, 'edit'
|
84
|
+
|
85
|
+
destroy: (e) ->
|
86
|
+
item = $(e.target).item()
|
87
|
+
item.destroy() if confirm('Sure?')
|
88
|
+
|
89
|
+
show: (e) ->
|
90
|
+
item = $(e.target).item()
|
91
|
+
@navigate '/<%= controller_name %>', item.id
|
92
|
+
|
93
|
+
new: ->
|
94
|
+
@navigate '/<%= controller_name %>/new'
|
95
|
+
|
96
|
+
class App.<%= controller_class %> extends Spine.Stack
|
97
|
+
controllers:
|
98
|
+
index: Index
|
99
|
+
edit: Edit
|
100
|
+
show: Show
|
101
|
+
new: New
|
102
|
+
|
103
|
+
routes:
|
104
|
+
'/<%= controller_name %>/new': 'new'
|
105
|
+
'/<%= controller_name %>/:id/edit': 'edit'
|
106
|
+
'/<%= controller_name %>/:id': 'show'
|
107
|
+
'/<%= controller_name %>': 'index'
|
108
|
+
|
109
|
+
default: 'index'
|
110
|
+
className: 'stack <%= controller_name %>'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<h1>Edit <%= model_class %></h1>
|
2
|
+
|
3
|
+
<form>
|
4
|
+
<% fields.each do |field| %>
|
5
|
+
<label>
|
6
|
+
<span><%= field.titleize %></span>
|
7
|
+
<input
|
8
|
+
type="text" name="<%= field %>"
|
9
|
+
value="<%%= @<%= field %> %>" required
|
10
|
+
<%- if field == fields[0] %> autofocus<% end %>>
|
11
|
+
</label>
|
12
|
+
<% end %>
|
13
|
+
<button>Edit</button>
|
14
|
+
|
15
|
+
</form>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h1>Listing <%= model_class.pluralize %></h1>
|
2
|
+
|
3
|
+
<%% for <%= model_name %> in @<%= controller_name %>: %>
|
4
|
+
<div class="item" data-id="<%%= <%= model_name %>.id %>">
|
5
|
+
<a data-type="show"><%%= <%= model_name %>.<%= fields[0] %> %></a>
|
6
|
+
|
7
|
+
<a data-type="edit">Edit</a>
|
8
|
+
<a data-type="destroy">Destroy</a>
|
9
|
+
</div>
|
10
|
+
<%% end %>
|
11
|
+
|
12
|
+
<p><a data-type="new">New <%= model_class %></a></p>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<h1>New <%= model_class %></h1>
|
2
|
+
|
3
|
+
<form>
|
4
|
+
<% fields.each do |field| %>
|
5
|
+
<label>
|
6
|
+
<span><%= field.titleize %></span>
|
7
|
+
<input
|
8
|
+
type="text" name="<%= field %>"
|
9
|
+
value="<%%= @<%= field %> %>" required
|
10
|
+
<%- if field == fields[0] %> autofocus<% end %>>
|
11
|
+
</label>
|
12
|
+
<% end %>
|
13
|
+
<button>Create</button>
|
14
|
+
|
15
|
+
</form>
|
data/lib/spine/generators.rb
CHANGED
@@ -3,17 +3,19 @@ module Spine
|
|
3
3
|
class Base < ::Rails::Generators::NamedBase
|
4
4
|
class_option :app, :type => :string, :default => "app", :desc => "app name"
|
5
5
|
|
6
|
-
|
7
|
-
(class_path + [file_name]).map!{ |m| m.camelize }.join('')
|
8
|
-
end
|
6
|
+
protected
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
def class_name
|
9
|
+
(class_path + [file_name]).map!{ |m| m.camelize }.join('')
|
10
|
+
end
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def app_name
|
13
|
+
options[:app]
|
14
|
+
end
|
15
|
+
|
16
|
+
def app_class
|
17
|
+
app_name.camelize
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/spine/rails/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spine-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-23 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70224443989420 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70224443989420
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70224443988460 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70224443988460
|
36
36
|
description: This gem provides Spine for your Rails 3 application.
|
37
37
|
email:
|
38
38
|
- info@eribium.org
|
@@ -61,6 +61,12 @@ files:
|
|
61
61
|
- lib/generators/spine/model/templates/model.coffee.erb
|
62
62
|
- lib/generators/spine/new/new_generator.rb
|
63
63
|
- lib/generators/spine/new/templates/index.coffee.erb
|
64
|
+
- lib/generators/spine/scaffold/scaffold_generator.rb
|
65
|
+
- lib/generators/spine/scaffold/templates/controller.coffee.erb
|
66
|
+
- lib/generators/spine/scaffold/templates/edit.jst.erb
|
67
|
+
- lib/generators/spine/scaffold/templates/index.jst.erb
|
68
|
+
- lib/generators/spine/scaffold/templates/new.jst.erb
|
69
|
+
- lib/generators/spine/scaffold/templates/show.jst.erb
|
64
70
|
- lib/generators/spine/view/templates/view.eco.erb
|
65
71
|
- lib/generators/spine/view/templates/view.ejs.erb
|
66
72
|
- lib/generators/spine/view/templates/view.hamljs.erb
|
@@ -96,3 +102,4 @@ signing_key:
|
|
96
102
|
specification_version: 3
|
97
103
|
summary: Use Spine with Rails 3
|
98
104
|
test_files: []
|
105
|
+
has_rdoc:
|