marionette_rails_generators 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +71 -0
- data/Rakefile +2 -0
- data/lib/generators/marionette/attribute.rb +54 -0
- data/lib/generators/marionette/controller/controller_generator.rb +57 -0
- data/lib/generators/marionette/controller/templates/app/controllers/controller.js.coffee +12 -0
- data/lib/generators/marionette/controller/templates/app/controllers/controller_with_views.js.coffee +16 -0
- data/lib/generators/marionette/install/install_generator.rb +91 -0
- data/lib/generators/marionette/install/templates/after_backbone.js.coffee +8 -0
- data/lib/generators/marionette/install/templates/app.js.coffee +21 -0
- data/lib/generators/marionette/install/templates/app/templates/index.jst.eco +118 -0
- data/lib/generators/marionette/install/templates/base/controllers/_base_controller.js.coffee +42 -0
- data/lib/generators/marionette/install/templates/base/models/_base_collection.js.coffee +3 -0
- data/lib/generators/marionette/install/templates/base/models/_base_model.js.coffee +40 -0
- data/lib/generators/marionette/install/templates/base/views/_view.js.coffee +56 -0
- data/lib/generators/marionette/install/templates/base/views/collectionview.js.coffee +4 -0
- data/lib/generators/marionette/install/templates/base/views/compositeview.js.coffee +4 -0
- data/lib/generators/marionette/install/templates/base/views/itemview.js.coffee +3 -0
- data/lib/generators/marionette/install/templates/base/views/layout.js.coffee +3 -0
- data/lib/generators/marionette/install/templates/before_backbone.js.coffee +2 -0
- data/lib/generators/marionette/install/templates/config/config.js.coffee +72 -0
- data/lib/generators/marionette/install/templates/config/controllers/loading/loading_controller.js.coffee +55 -0
- data/lib/generators/marionette/install/templates/config/controllers/loading/loading_view.js.coffee +30 -0
- data/lib/generators/marionette/install/templates/config/models/fetch.js.coffee +11 -0
- data/lib/generators/marionette/install/templates/config/models/sync.js.coffee +19 -0
- data/lib/generators/marionette/install/templates/index.html.erb +9 -0
- data/lib/generators/marionette/install/templates/routes.js.coffee +13 -0
- data/lib/generators/marionette/model/model_generator.rb +42 -0
- data/lib/generators/marionette/model/templates/app/models/entity.js.coffee +14 -0
- data/lib/generators/marionette/resource_helpers.rb +104 -0
- data/lib/generators/marionette/scaffold/scaffold_generator.rb +194 -0
- data/lib/generators/marionette/scaffold/templates/templates/_empty.jst.eco +1 -0
- data/lib/generators/marionette/scaffold/templates/templates/_form.jst.eco +6 -0
- data/lib/generators/marionette/scaffold/templates/templates/_post.jst.eco +6 -0
- data/lib/generators/marionette/scaffold/templates/templates/edit.jst.eco +6 -0
- data/lib/generators/marionette/scaffold/templates/templates/index.jst.eco +19 -0
- data/lib/generators/marionette/scaffold/templates/templates/new.jst.eco +6 -0
- data/lib/generators/marionette/scaffold/templates/templates/show.jst.eco +10 -0
- data/lib/generators/marionette/view/templates/app/templates/collection_view.jst.eco +1 -0
- data/lib/generators/marionette/view/templates/app/templates/composite_view.jst.eco +1 -0
- data/lib/generators/marionette/view/templates/app/templates/item_view.jst.eco +10 -0
- data/lib/generators/marionette/view/templates/app/templates/layouts/application.jst.eco +2 -0
- data/lib/generators/marionette/view/templates/app/views/collection_view.js.coffee +4 -0
- data/lib/generators/marionette/view/templates/app/views/composite_view.js.coffee +4 -0
- data/lib/generators/marionette/view/templates/app/views/item_view.js.coffee +7 -0
- data/lib/generators/marionette/view/view_generator.rb +112 -0
- data/lib/marionette_rails_generators.rb +8 -0
- data/lib/marionette_rails_generators/version.rb +3 -0
- data/marionette_rails_generators.gemspec +33 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +32 -0
- data/spec/dummy/app/assets/javascripts/backbone/after_backbone.js.coffee +8 -0
- data/spec/dummy/app/assets/javascripts/backbone/app.js.coffee +21 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/controllers/all/root_controller.js.coffee +14 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/models/admin/books.js.coffee +11 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/models/all/posts.js.coffee +13 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/models/test_subsubmodule/test_submodule/test_module/stars.js.coffee +11 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/admin/test_collection_view2.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_collection_view1.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_composite_view1.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view1.jst.eco +54 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view2.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/application.jst.eco +2 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout1.jst.eco +2 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout2.jst.eco +2 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout3.jst.eco +2 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/root/index.jst.eco +118 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_composite_view2.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_item_view3.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_collection_view3.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_composite_view3.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_item_view4.jst.eco +1 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/admin/test_collection_view2.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_collection_view1.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_composite_view1.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view1.js.coffee +7 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view2.js.coffee +7 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/layouts/layouts.js.coffee +21 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/root/index.js.coffee +7 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_composite_view2.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_item_view3.js.coffee +7 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_collection_view3.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_composite_view3.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_item_view4.js.coffee +7 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/controllers/_base_controller.js.coffee +42 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_collection.js.coffee +3 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_model.js.coffee +40 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/views/_view.js.coffee +56 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/views/collectionview.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/views/compositeview.js.coffee +4 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/views/itemview.js.coffee +3 -0
- data/spec/dummy/app/assets/javascripts/backbone/base/views/layout.js.coffee +3 -0
- data/spec/dummy/app/assets/javascripts/backbone/before_backbone.js.coffee +2 -0
- data/spec/dummy/app/assets/javascripts/backbone/config/config.js.coffee +72 -0
- data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_controller.js.coffee +55 -0
- data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_view.js.coffee +30 -0
- data/spec/dummy/app/assets/javascripts/backbone/config/models/fetch.js.coffee +11 -0
- data/spec/dummy/app/assets/javascripts/backbone/config/models/sync.js.coffee +19 -0
- data/spec/dummy/app/assets/javascripts/backbone/routes.js.coffee +14 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/application/index.html.erb +9 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/javascripts/helpers/SpecHelper.coffee +6 -0
- data/spec/dummy/spec/javascripts/specs/backbone_install_spec.coffee +78 -0
- data/spec/dummy/spec/javascripts/specs/entity_generator_spec.coffee +13 -0
- data/spec/dummy/spec/javascripts/specs/view_generator_spec.coffee +44 -0
- data/spec/dummy/spec/javascripts/support/jasmine.yml +124 -0
- data/spec/dummy/spec/javascripts/support/jasmine_helper.rb +49 -0
- data/vendor/assets/javascripts/backbone-syphon.js +469 -0
- data/vendor/assets/javascripts/jquery.spin.js +435 -0
- metadata +445 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
module Marionette
|
2
|
+
# Resource helpers
|
3
|
+
module ResourceHelpers
|
4
|
+
def javascript_path
|
5
|
+
'app/assets/javascripts'
|
6
|
+
end
|
7
|
+
|
8
|
+
def backbone_path
|
9
|
+
"#{javascript_path}/backbone"
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_action
|
13
|
+
'index'
|
14
|
+
end
|
15
|
+
|
16
|
+
def default_controller
|
17
|
+
'application'
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_route
|
21
|
+
"#{default_controller}##{default_action}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def embed_file(source, indent = '')
|
25
|
+
IO.read(File.join(self.class.source_root, source)).gsub(/^/, indent)
|
26
|
+
end
|
27
|
+
|
28
|
+
def embed_template(source, indent = '')
|
29
|
+
template = File.join(self.class.source_root, source)
|
30
|
+
ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
|
31
|
+
end
|
32
|
+
|
33
|
+
def replace_underscore(string)
|
34
|
+
string[0] == '_' ? string[1..-1] : string
|
35
|
+
end
|
36
|
+
|
37
|
+
def controller_attr(file, type, attrs)
|
38
|
+
sentinel = /when '#{type.to_s}'$/
|
39
|
+
in_root do
|
40
|
+
inject_into_file "#{backbone_path}/app/controllers/#{file}.js.coffee", " #{attrs}", { after: sentinel, verbose: false }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def view_attr(file, attrs)
|
45
|
+
sentinel = /extends.*$/
|
46
|
+
in_root do
|
47
|
+
inject_into_file "#{backbone_path}/app/views/#{file}.js.coffee", "\n#{attrs}", { after: sentinel, verbose: false }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def marionette_route(routing_code, type, modul='All')
|
52
|
+
sentinel = /appRoutes\:\s*$/
|
53
|
+
|
54
|
+
route = routing_code
|
55
|
+
|
56
|
+
case type
|
57
|
+
when :index
|
58
|
+
route = " \"#{routing_code}(/)\": \"#{routing_code}_index\""
|
59
|
+
when :new
|
60
|
+
route = " \"#{routing_code}/new(/)\": \"#{routing_code}_new\""
|
61
|
+
when :show
|
62
|
+
route = " \"#{routing_code}/:id(/)\": \"#{routing_code}_show\""
|
63
|
+
when :edit
|
64
|
+
route = " \"#{routing_code}/:id/edit(/)\": \"#{routing_code}_edit\""
|
65
|
+
end
|
66
|
+
|
67
|
+
log :marionette_route, route
|
68
|
+
|
69
|
+
in_root do
|
70
|
+
inject_into_file "#{backbone_path}/routes.js.coffee", "\n #{route}", { after: sentinel, verbose: false }
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
case type
|
75
|
+
when :index
|
76
|
+
api = %(
|
77
|
+
#{routing_code}_index: ->
|
78
|
+
new App.Controllers.#{modul}.#{routing_code.camelize}(action: 'index')
|
79
|
+
)
|
80
|
+
when :new
|
81
|
+
api = %(
|
82
|
+
#{routing_code}_new: ->
|
83
|
+
new App.Controllers.#{modul}.#{routing_code.camelize}(action: 'new')
|
84
|
+
)
|
85
|
+
when :show
|
86
|
+
api = %(
|
87
|
+
#{routing_code}_show: (id) ->
|
88
|
+
new App.Controllers.#{modul}.#{routing_code.camelize}(id: id, action: 'show')
|
89
|
+
)
|
90
|
+
when :edit
|
91
|
+
api = %(
|
92
|
+
#{routing_code}_edit: (id) ->
|
93
|
+
new App.Controllers.#{modul}.#{routing_code.camelize}(id: id, action: 'edit')
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
97
|
+
sentinel = /API \=\s*$/
|
98
|
+
|
99
|
+
in_root do
|
100
|
+
inject_into_file "#{backbone_path}/routes.js.coffee", "\n#{api}", { after: sentinel, verbose: false }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'generators/marionette/resource_helpers'
|
2
|
+
require 'generators/marionette/attribute'
|
3
|
+
|
4
|
+
# :nodoc:
|
5
|
+
class Marionette::ScaffoldGenerator < Rails::Generators::Base
|
6
|
+
include Marionette::ResourceHelpers
|
7
|
+
desc %(Description:
|
8
|
+
Scaffolds an entire resource, from model to controller and
|
9
|
+
views. The resource is ready to use as a
|
10
|
+
starting point for your RESTful, resource-oriented application.
|
11
|
+
|
12
|
+
Pass the name of the model (in singular form), either CamelCased or
|
13
|
+
under_scored, as the first argument, and an optional list of attribute
|
14
|
+
pairs.
|
15
|
+
|
16
|
+
Attributes are field arguments specifying the model's attributes. For instance:
|
17
|
+
'title:string body:text tracking_id:integer' will generate a title field of
|
18
|
+
string type, a body with text type and a tracking_id as an integer.
|
19
|
+
|
20
|
+
You don't have to think up every attribute up front, but it helps to
|
21
|
+
sketch out a few so you can start working with the resource immediately.
|
22
|
+
|
23
|
+
For example, 'scaffold post title body:text published:boolean' gives
|
24
|
+
you a model with those three attributes, a controller that handles
|
25
|
+
the create/show/update/destroy, forms to create and edit your posts, and
|
26
|
+
an index that lists them all, as well as a resources :posts declaration
|
27
|
+
in routes.js.coffee.
|
28
|
+
|
29
|
+
Examples:
|
30
|
+
`rails generate marionette:scaffold post title:string body:text published:boolean`
|
31
|
+
)
|
32
|
+
|
33
|
+
source_root File.expand_path('../templates', __FILE__)
|
34
|
+
|
35
|
+
argument :title, type: :string, required: true, banner: 'Title'
|
36
|
+
argument :schema, type: :hash, default: {}, banner: 'title:string description:text'
|
37
|
+
class_option :rails, type: :boolean, default: false,
|
38
|
+
desc: 'also run (rails generate scaffold Title [title:string description:text]) and wrap resource route to "/api" scope'
|
39
|
+
def vars
|
40
|
+
@module = 'All'
|
41
|
+
if @title =~ /\//
|
42
|
+
parse = @title.match /(.*)\/(.*)/
|
43
|
+
@title = parse[2]
|
44
|
+
@module = parse[1]
|
45
|
+
end
|
46
|
+
@rails = options[:rails]
|
47
|
+
@one = @title.singularize
|
48
|
+
@many = @title.pluralize
|
49
|
+
@attributes = []
|
50
|
+
@schema.each do |a|
|
51
|
+
@attributes << Marionette::Attribute.new(a[0], a[1])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def scaffold
|
56
|
+
generate "marionette:model #{@one.camelcase} #{@schema.map {|a| "#{a[0]}:#{a[1]}"}.join(' ')}"
|
57
|
+
|
58
|
+
#form
|
59
|
+
template 'templates/_form.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_form.jst.eco"
|
60
|
+
#empty
|
61
|
+
generate "marionette:view #{@many.underscore}/_empty ItemView --without-template"
|
62
|
+
template 'templates/_empty.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_empty.jst.eco"
|
63
|
+
#post
|
64
|
+
generate "marionette:view #{@many.underscore}/_#{@one.underscore} ItemView --without-template"
|
65
|
+
view_attr @many.underscore + "/_#{@one.underscore}", %(
|
66
|
+
tagName: "tr"
|
67
|
+
triggers:
|
68
|
+
"click .#{@one.underscore}-delete" : "#{@one.underscore}:delete:clicked"
|
69
|
+
)
|
70
|
+
template 'templates/_post.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_#{@one.underscore}.jst.eco"
|
71
|
+
#edit
|
72
|
+
generate "marionette:view #{@many.underscore}/edit CompositeView --without-template"
|
73
|
+
view_attr @many.underscore + '/edit', %(
|
74
|
+
triggers:
|
75
|
+
"click .#{@one.underscore}-save" : "#{@many.underscore}:save:clicked"
|
76
|
+
|
77
|
+
onShow: ->
|
78
|
+
Backbone.Syphon.deserialize(@, @.model.attributes)
|
79
|
+
@listenTo @, "#{@many.underscore}:save:clicked", (child, args) ->
|
80
|
+
data = Backbone.Syphon.serialize(@)
|
81
|
+
#{@one.underscore} = child.model
|
82
|
+
#{@one.underscore}.set(data)
|
83
|
+
#{@one.underscore}.saveSuccess = (check, und, model, response) ->
|
84
|
+
App.navigate '#{@many.underscore}/' + response.id
|
85
|
+
#{@one.underscore}.saveError = (check, und, model, response) ->
|
86
|
+
console.log response
|
87
|
+
alert('error')
|
88
|
+
#{@one.underscore}.save()
|
89
|
+
)
|
90
|
+
template 'templates/edit.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/edit.jst.eco"
|
91
|
+
#index
|
92
|
+
generate "marionette:view #{@many.underscore}/index CompositeView --without-template"
|
93
|
+
view_attr @many.underscore + '/index', %(
|
94
|
+
childView: #{@many.camelcase}.#{@one.camelcase}
|
95
|
+
emptyView: #{@many.camelcase}.Empty
|
96
|
+
childViewContainer: "tbody"
|
97
|
+
|
98
|
+
onShow: ->
|
99
|
+
|
100
|
+
@listenTo @, "childview:#{@one.underscore}:delete:clicked", (child, args) ->
|
101
|
+
model = args.model
|
102
|
+
if confirm "Are you sure you want to delete \#{model.get("name")}?"
|
103
|
+
model.destroy()
|
104
|
+
)
|
105
|
+
template 'templates/index.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/index.jst.eco"
|
106
|
+
#new
|
107
|
+
generate "marionette:view #{@many.underscore}/new CompositeView --without-template"
|
108
|
+
view_attr @many.underscore + '/new', %(
|
109
|
+
triggers:
|
110
|
+
"click .#{@one.underscore}-create" : "#{@many.underscore}:create:clicked"
|
111
|
+
|
112
|
+
onShow: ->
|
113
|
+
@listenTo @, "#{@many.underscore}:create:clicked", (child, args) ->
|
114
|
+
data = Backbone.Syphon.serialize(@)
|
115
|
+
#{@one.underscore} = new App.Entities.All.#{@one.camelcase}
|
116
|
+
#{@one.underscore}.set(data)
|
117
|
+
#{@one.underscore}.saveSuccess = (check, und, model, response) ->
|
118
|
+
App.navigate '#{@many.underscore}/' + response.id
|
119
|
+
#{@one.underscore}.saveError = (check, und, model, response) ->
|
120
|
+
console.log response
|
121
|
+
alert('error')
|
122
|
+
#{@one.underscore}.save()
|
123
|
+
)
|
124
|
+
template 'templates/new.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/new.jst.eco"
|
125
|
+
#show
|
126
|
+
generate "marionette:view #{@many.underscore}/show CompositeView --without-template"
|
127
|
+
view_attr @many.underscore + '/show', %(
|
128
|
+
triggers:
|
129
|
+
"click .#{@one.underscore}-delete" : "#{@one.underscore}:delete:clicked"
|
130
|
+
|
131
|
+
onShow: ->
|
132
|
+
@listenTo @, "#{@one.underscore}:delete:clicked", (child, args) ->
|
133
|
+
model = child.model
|
134
|
+
if confirm "Are you sure you want to delete \#{model.get("name")}?"
|
135
|
+
model.destroy()
|
136
|
+
App.navigate '/#{@many.underscore}'
|
137
|
+
)
|
138
|
+
template 'templates/show.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/show.jst.eco"
|
139
|
+
|
140
|
+
generate "marionette:controller #{@many.underscore}"
|
141
|
+
controller_attr @module.underscore + '/' + @many.underscore + '_controller', :index, %(
|
142
|
+
#{@many.underscore} = new App.Entities.All.#{@one.camelcase}Collection
|
143
|
+
#{@many.underscore}.fetch
|
144
|
+
reset: true
|
145
|
+
@layout = new App.Views.Layouts.ApplicationLayout
|
146
|
+
@listenTo @layout, "show", =>
|
147
|
+
indexView = new App.Views.#{@many.camelcase}.Index(collection: #{@many.underscore})
|
148
|
+
@show indexView, region: @layout.bodyRegion, loading: true
|
149
|
+
@show @layout, loading: false
|
150
|
+
)
|
151
|
+
controller_attr @module.underscore + '/' + @many.underscore + '_controller', :new, %(
|
152
|
+
@layout = new App.Views.Layouts.ApplicationLayout
|
153
|
+
@listenTo @layout, "show", =>
|
154
|
+
newView = new App.Views.#{@many.camelcase}.New
|
155
|
+
@show newView, region: @layout.bodyRegion, loading: true
|
156
|
+
@show @layout, loading: false
|
157
|
+
)
|
158
|
+
controller_attr @module.underscore + '/' + @many.underscore + '_controller', :show, %(
|
159
|
+
#{@one.underscore} = new App.Entities.All.#{@one.camelcase} id: args.id
|
160
|
+
#{@one.underscore}.fetch
|
161
|
+
reset: true
|
162
|
+
@layout = new App.Views.Layouts.ApplicationLayout
|
163
|
+
@listenTo @layout, "show", =>
|
164
|
+
showView = new App.Views.#{@many.camelcase}.Show(model: #{@one.underscore})
|
165
|
+
@show showView, region: @layout.bodyRegion, loading: true
|
166
|
+
@show @layout, loading: false
|
167
|
+
)
|
168
|
+
controller_attr @module.underscore + '/' + @many.underscore + '_controller', :edit, %(
|
169
|
+
#{@one.underscore} = new App.Entities.All.#{@one.camelcase} id: args.id
|
170
|
+
#{@one.underscore}.fetch
|
171
|
+
reset: true
|
172
|
+
@layout = new App.Views.Layouts.ApplicationLayout
|
173
|
+
@listenTo @layout, "show", =>
|
174
|
+
editView = new App.Views.#{@many.camelcase}.Edit(model: #{@one.underscore})
|
175
|
+
@show editView, region: @layout.bodyRegion, loading: true
|
176
|
+
@show @layout, loading: false
|
177
|
+
)
|
178
|
+
marionette_route(@many.underscore, :edit)
|
179
|
+
marionette_route(@many.underscore, :show)
|
180
|
+
marionette_route(@many.underscore, :new)
|
181
|
+
marionette_route(@many.underscore, :index)
|
182
|
+
|
183
|
+
if @rails
|
184
|
+
generate "scaffold #{@one.camelcase} #{@schema.map {|a| "#{a[0]}:#{a[1]}"}.join(' ')}"
|
185
|
+
gsub_file 'config/routes.rb', "\n resources :#{@many.underscore}" do |match|
|
186
|
+
%(
|
187
|
+
scope :api, constraints: { format: 'json' } do
|
188
|
+
resources :#{@many.underscore}
|
189
|
+
end
|
190
|
+
)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>No content</p>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% @schema.each do |a| %>
|
2
|
+
<td><%%= @<%= a[0] %> %></td>
|
3
|
+
<% end %>
|
4
|
+
<td><a href="/<%= @many.underscore %>/<%%= @id %>/" class="<%= @one.underscore %>-show">Show</a></td>
|
5
|
+
<td><a href="/<%= @many.underscore %>/<%%= @id %>/edit/" class="<%= @one.underscore %>-edit">Edit</a></td>
|
6
|
+
<td><a href="" class="<%= @one.underscore %>-delete">Delete</a> </td>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h1>Listing <%= @many.underscore %></h1>
|
2
|
+
|
3
|
+
<table cellspacing="0" cellpadding="0">
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<%- @schema.each do |a| -%>
|
7
|
+
<td><%= a[0].camelcase %></td>
|
8
|
+
<%- end -%>
|
9
|
+
<th colspan="3"></th>
|
10
|
+
</tr>
|
11
|
+
</thead>
|
12
|
+
|
13
|
+
<tbody>
|
14
|
+
</tbody>
|
15
|
+
</table>
|
16
|
+
|
17
|
+
<br>
|
18
|
+
|
19
|
+
<a href="/<%= @many.underscore %>/new" class="<%= @one.underscore %>-new">New <%= @one.camelcase %></a>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% @schema.each do |a| %>
|
2
|
+
<p>
|
3
|
+
<strong><%= a[0].camelcase %>: </strong>
|
4
|
+
<%%= @<%= a[0] %> %>
|
5
|
+
</p>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<p><a href="/<%= @many.underscore %>/<%%= @id %>/edit" class="<%= @one.underscore %>-edit">Edit</a></p>
|
9
|
+
<p><a href="" class="<%= @one.underscore %>-delete">Delete</a></p>
|
10
|
+
<a href="/<%= @many.underscore %>">Back</a>
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%- if @attributes.blank? -%>
|
2
|
+
<p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
|
3
|
+
<%- else -%>
|
4
|
+
<form action="" method="post">
|
5
|
+
<%- @attributes.each do |a| -%>
|
6
|
+
<%= a.html %>
|
7
|
+
|
8
|
+
<%- end -%>
|
9
|
+
</form>
|
10
|
+
<%- end -%>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
@Backbone.app.module "Views.<%= @module.split('/').map{ |v| v.camelcase }.join('.') %>", (<%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>, App, Backbone, Marionette, $, _) ->
|
2
|
+
|
3
|
+
class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %> extends App.Views.CollectionView
|
4
|
+
template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
|
@@ -0,0 +1,4 @@
|
|
1
|
+
@Backbone.app.module "Views.<%= @module.split('/').map{ |v| v.camelcase }.join('.') %>", (<%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>, App, Backbone, Marionette, $, _) ->
|
2
|
+
|
3
|
+
class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %> extends App.Views.CompositeView
|
4
|
+
template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
|
@@ -0,0 +1,7 @@
|
|
1
|
+
@Backbone.app.module "Views.<%= @module.split('/').map{ |v| v.camelcase }.join('.') %>", (<%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>, App, Backbone, Marionette, $, _) ->
|
2
|
+
|
3
|
+
class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %> extends App.Views.ItemView
|
4
|
+
template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
|
5
|
+
|
6
|
+
|
7
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'generators/marionette/resource_helpers'
|
2
|
+
require 'generators/marionette/attribute'
|
3
|
+
|
4
|
+
# :nodoc:
|
5
|
+
class Marionette::ViewGenerator < Rails::Generators::Base
|
6
|
+
include Marionette::ResourceHelpers
|
7
|
+
include ActionView::Helpers::FormTagHelper
|
8
|
+
desc %(Description:
|
9
|
+
Stubs out a new view. Pass the view name, either
|
10
|
+
CamelCased or under_scored, and a type of view as argument.
|
11
|
+
|
12
|
+
Pass an optional list of attribute pairs as arguments for
|
13
|
+
filling template with form.
|
14
|
+
|
15
|
+
To create a view within a module, specify the view name as a
|
16
|
+
path like 'parent_module/view_name'.
|
17
|
+
|
18
|
+
This generates a view class in app/assets/javascripts/backbone/app/views
|
19
|
+
and template in app/assets/javascripts/backbone/app/templates folder.
|
20
|
+
|
21
|
+
Type may take the following values: partial, Layout,
|
22
|
+
ItemView, CollectionView, CompositeView
|
23
|
+
|
24
|
+
Layouts views appends to
|
25
|
+
app/assets/javascripts/backbone/app/views/layouts/layouts.js.coffee
|
26
|
+
|
27
|
+
Example:
|
28
|
+
rails g marionette:view index ItemView title:string description:text
|
29
|
+
generates ItemView 'Backbone.app.Views.All.Index'
|
30
|
+
and template filled with form
|
31
|
+
rails g marionette:view posts/index ItemView title:string description:text
|
32
|
+
generates ItemView 'Backbone.app.Views.Posts.Index'
|
33
|
+
and template filled with form
|
34
|
+
rails g marionette:view blogs/posts/index ItemView
|
35
|
+
generates ItemView 'Backbone.app.Views.Blogs.Posts.Index'
|
36
|
+
and stub template
|
37
|
+
)
|
38
|
+
|
39
|
+
source_root File.expand_path('../templates', __FILE__)
|
40
|
+
|
41
|
+
argument :title, type: :string
|
42
|
+
argument :type, type: :string
|
43
|
+
argument :schema, type: :hash, default: {}, banner: 'title:string description:text'
|
44
|
+
class_option 'without-template', type: :boolean, default: false, desc: 'generate View without template'
|
45
|
+
|
46
|
+
def vars
|
47
|
+
@module = 'All'
|
48
|
+
if @title =~ /\//
|
49
|
+
parse = @title.match /(.*)\/(.*)/
|
50
|
+
@title = parse[2]
|
51
|
+
@module = parse[1]
|
52
|
+
end
|
53
|
+
@withouttempl = options['without-template']
|
54
|
+
@partial = false
|
55
|
+
@partial = true if type == 'partial'
|
56
|
+
@titletemplate = @title
|
57
|
+
@titletemplate = '_' + @titletemplate if @partial
|
58
|
+
@attributes = []
|
59
|
+
@schema.each do |a|
|
60
|
+
@attributes << Marionette::Attribute.new(a[0], a[1])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def layout
|
65
|
+
@begin_layout = "@Backbone.app.module \"Views.Layouts\", (Layouts, App, Backbone, Marionette, $, _) ->\n"
|
66
|
+
@layout = %(
|
67
|
+
class Layouts.#{@title.camelcase}Layout extends App.Views.Layout
|
68
|
+
template: 'layouts/#{@titletemplate.underscore}'
|
69
|
+
regions:
|
70
|
+
bodyRegion: "#body"
|
71
|
+
)
|
72
|
+
@layout = @begin_layout + @layout
|
73
|
+
end
|
74
|
+
|
75
|
+
def generate_view
|
76
|
+
case type
|
77
|
+
when 'layout', 'Layout'
|
78
|
+
unless @partial
|
79
|
+
if File.exist?("#{backbone_path}/app/views/layouts/layouts.js.coffee")
|
80
|
+
append_file "#{backbone_path}/app/views/layouts/layouts.js.coffee", @layout.gsub(@begin_layout, '')
|
81
|
+
else
|
82
|
+
create_file "#{backbone_path}/app/views/layouts/layouts.js.coffee", @layout
|
83
|
+
end
|
84
|
+
end
|
85
|
+
template 'app/templates/layouts/application.jst.eco',
|
86
|
+
"#{backbone_path}/app/templates/layouts/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
|
87
|
+
when 'item_view', 'ItemView', 'partial'
|
88
|
+
unless @partial
|
89
|
+
template 'app/views/item_view.js.coffee',
|
90
|
+
"#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
|
91
|
+
end
|
92
|
+
template 'app/templates/item_view.jst.eco',
|
93
|
+
"#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
|
94
|
+
when 'collection_view', 'CollectionView'
|
95
|
+
unless @partial
|
96
|
+
template 'app/views/collection_view.js.coffee',
|
97
|
+
"#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
|
98
|
+
end
|
99
|
+
template 'app/templates/collection_view.jst.eco',
|
100
|
+
"#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
|
101
|
+
when 'composite_view', 'CompositeView'
|
102
|
+
unless @partial
|
103
|
+
template 'app/views/composite_view.js.coffee',
|
104
|
+
"#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
|
105
|
+
end
|
106
|
+
template 'app/templates/composite_view.jst.eco',
|
107
|
+
"#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
|
108
|
+
else
|
109
|
+
puts "Type [#{type}] didn't supported. Feel free to submit issue https://github.com/itbeaver/marionette_rails_generators/issues"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|