marionette_rails_generators 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +71 -0
  6. data/Rakefile +2 -0
  7. data/lib/generators/marionette/attribute.rb +54 -0
  8. data/lib/generators/marionette/controller/controller_generator.rb +57 -0
  9. data/lib/generators/marionette/controller/templates/app/controllers/controller.js.coffee +12 -0
  10. data/lib/generators/marionette/controller/templates/app/controllers/controller_with_views.js.coffee +16 -0
  11. data/lib/generators/marionette/install/install_generator.rb +91 -0
  12. data/lib/generators/marionette/install/templates/after_backbone.js.coffee +8 -0
  13. data/lib/generators/marionette/install/templates/app.js.coffee +21 -0
  14. data/lib/generators/marionette/install/templates/app/templates/index.jst.eco +118 -0
  15. data/lib/generators/marionette/install/templates/base/controllers/_base_controller.js.coffee +42 -0
  16. data/lib/generators/marionette/install/templates/base/models/_base_collection.js.coffee +3 -0
  17. data/lib/generators/marionette/install/templates/base/models/_base_model.js.coffee +40 -0
  18. data/lib/generators/marionette/install/templates/base/views/_view.js.coffee +56 -0
  19. data/lib/generators/marionette/install/templates/base/views/collectionview.js.coffee +4 -0
  20. data/lib/generators/marionette/install/templates/base/views/compositeview.js.coffee +4 -0
  21. data/lib/generators/marionette/install/templates/base/views/itemview.js.coffee +3 -0
  22. data/lib/generators/marionette/install/templates/base/views/layout.js.coffee +3 -0
  23. data/lib/generators/marionette/install/templates/before_backbone.js.coffee +2 -0
  24. data/lib/generators/marionette/install/templates/config/config.js.coffee +72 -0
  25. data/lib/generators/marionette/install/templates/config/controllers/loading/loading_controller.js.coffee +55 -0
  26. data/lib/generators/marionette/install/templates/config/controllers/loading/loading_view.js.coffee +30 -0
  27. data/lib/generators/marionette/install/templates/config/models/fetch.js.coffee +11 -0
  28. data/lib/generators/marionette/install/templates/config/models/sync.js.coffee +19 -0
  29. data/lib/generators/marionette/install/templates/index.html.erb +9 -0
  30. data/lib/generators/marionette/install/templates/routes.js.coffee +13 -0
  31. data/lib/generators/marionette/model/model_generator.rb +42 -0
  32. data/lib/generators/marionette/model/templates/app/models/entity.js.coffee +14 -0
  33. data/lib/generators/marionette/resource_helpers.rb +104 -0
  34. data/lib/generators/marionette/scaffold/scaffold_generator.rb +194 -0
  35. data/lib/generators/marionette/scaffold/templates/templates/_empty.jst.eco +1 -0
  36. data/lib/generators/marionette/scaffold/templates/templates/_form.jst.eco +6 -0
  37. data/lib/generators/marionette/scaffold/templates/templates/_post.jst.eco +6 -0
  38. data/lib/generators/marionette/scaffold/templates/templates/edit.jst.eco +6 -0
  39. data/lib/generators/marionette/scaffold/templates/templates/index.jst.eco +19 -0
  40. data/lib/generators/marionette/scaffold/templates/templates/new.jst.eco +6 -0
  41. data/lib/generators/marionette/scaffold/templates/templates/show.jst.eco +10 -0
  42. data/lib/generators/marionette/view/templates/app/templates/collection_view.jst.eco +1 -0
  43. data/lib/generators/marionette/view/templates/app/templates/composite_view.jst.eco +1 -0
  44. data/lib/generators/marionette/view/templates/app/templates/item_view.jst.eco +10 -0
  45. data/lib/generators/marionette/view/templates/app/templates/layouts/application.jst.eco +2 -0
  46. data/lib/generators/marionette/view/templates/app/views/collection_view.js.coffee +4 -0
  47. data/lib/generators/marionette/view/templates/app/views/composite_view.js.coffee +4 -0
  48. data/lib/generators/marionette/view/templates/app/views/item_view.js.coffee +7 -0
  49. data/lib/generators/marionette/view/view_generator.rb +112 -0
  50. data/lib/marionette_rails_generators.rb +8 -0
  51. data/lib/marionette_rails_generators/version.rb +3 -0
  52. data/marionette_rails_generators.gemspec +33 -0
  53. data/spec/dummy/README.rdoc +28 -0
  54. data/spec/dummy/Rakefile +6 -0
  55. data/spec/dummy/app/assets/images/.keep +0 -0
  56. data/spec/dummy/app/assets/javascripts/application.js +32 -0
  57. data/spec/dummy/app/assets/javascripts/backbone/after_backbone.js.coffee +8 -0
  58. data/spec/dummy/app/assets/javascripts/backbone/app.js.coffee +21 -0
  59. data/spec/dummy/app/assets/javascripts/backbone/app/controllers/all/root_controller.js.coffee +14 -0
  60. data/spec/dummy/app/assets/javascripts/backbone/app/models/admin/books.js.coffee +11 -0
  61. data/spec/dummy/app/assets/javascripts/backbone/app/models/all/posts.js.coffee +13 -0
  62. data/spec/dummy/app/assets/javascripts/backbone/app/models/test_subsubmodule/test_submodule/test_module/stars.js.coffee +11 -0
  63. data/spec/dummy/app/assets/javascripts/backbone/app/templates/admin/test_collection_view2.jst.eco +1 -0
  64. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_collection_view1.jst.eco +1 -0
  65. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_composite_view1.jst.eco +1 -0
  66. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view1.jst.eco +54 -0
  67. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view2.jst.eco +1 -0
  68. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/application.jst.eco +2 -0
  69. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout1.jst.eco +2 -0
  70. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout2.jst.eco +2 -0
  71. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout3.jst.eco +2 -0
  72. data/spec/dummy/app/assets/javascripts/backbone/app/templates/root/index.jst.eco +118 -0
  73. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_composite_view2.jst.eco +1 -0
  74. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_item_view3.jst.eco +1 -0
  75. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_collection_view3.jst.eco +1 -0
  76. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_composite_view3.jst.eco +1 -0
  77. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_item_view4.jst.eco +1 -0
  78. data/spec/dummy/app/assets/javascripts/backbone/app/views/admin/test_collection_view2.js.coffee +4 -0
  79. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_collection_view1.js.coffee +4 -0
  80. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_composite_view1.js.coffee +4 -0
  81. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view1.js.coffee +7 -0
  82. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view2.js.coffee +7 -0
  83. data/spec/dummy/app/assets/javascripts/backbone/app/views/layouts/layouts.js.coffee +21 -0
  84. data/spec/dummy/app/assets/javascripts/backbone/app/views/root/index.js.coffee +7 -0
  85. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_composite_view2.js.coffee +4 -0
  86. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_item_view3.js.coffee +7 -0
  87. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_collection_view3.js.coffee +4 -0
  88. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_composite_view3.js.coffee +4 -0
  89. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_item_view4.js.coffee +7 -0
  90. data/spec/dummy/app/assets/javascripts/backbone/base/controllers/_base_controller.js.coffee +42 -0
  91. data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_collection.js.coffee +3 -0
  92. data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_model.js.coffee +40 -0
  93. data/spec/dummy/app/assets/javascripts/backbone/base/views/_view.js.coffee +56 -0
  94. data/spec/dummy/app/assets/javascripts/backbone/base/views/collectionview.js.coffee +4 -0
  95. data/spec/dummy/app/assets/javascripts/backbone/base/views/compositeview.js.coffee +4 -0
  96. data/spec/dummy/app/assets/javascripts/backbone/base/views/itemview.js.coffee +3 -0
  97. data/spec/dummy/app/assets/javascripts/backbone/base/views/layout.js.coffee +3 -0
  98. data/spec/dummy/app/assets/javascripts/backbone/before_backbone.js.coffee +2 -0
  99. data/spec/dummy/app/assets/javascripts/backbone/config/config.js.coffee +72 -0
  100. data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_controller.js.coffee +55 -0
  101. data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_view.js.coffee +30 -0
  102. data/spec/dummy/app/assets/javascripts/backbone/config/models/fetch.js.coffee +11 -0
  103. data/spec/dummy/app/assets/javascripts/backbone/config/models/sync.js.coffee +19 -0
  104. data/spec/dummy/app/assets/javascripts/backbone/routes.js.coffee +14 -0
  105. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  106. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  107. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  108. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  109. data/spec/dummy/app/mailers/.keep +0 -0
  110. data/spec/dummy/app/models/.keep +0 -0
  111. data/spec/dummy/app/models/concerns/.keep +0 -0
  112. data/spec/dummy/app/views/application/index.html.erb +9 -0
  113. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  114. data/spec/dummy/bin/bundle +3 -0
  115. data/spec/dummy/bin/rails +4 -0
  116. data/spec/dummy/bin/rake +4 -0
  117. data/spec/dummy/bin/setup +29 -0
  118. data/spec/dummy/config.ru +4 -0
  119. data/spec/dummy/config/application.rb +30 -0
  120. data/spec/dummy/config/boot.rb +5 -0
  121. data/spec/dummy/config/database.yml +25 -0
  122. data/spec/dummy/config/environment.rb +5 -0
  123. data/spec/dummy/config/environments/development.rb +41 -0
  124. data/spec/dummy/config/environments/production.rb +79 -0
  125. data/spec/dummy/config/environments/test.rb +42 -0
  126. data/spec/dummy/config/initializers/assets.rb +11 -0
  127. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  128. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  129. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  130. data/spec/dummy/config/initializers/inflections.rb +16 -0
  131. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  132. data/spec/dummy/config/initializers/session_store.rb +3 -0
  133. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  134. data/spec/dummy/config/locales/en.yml +23 -0
  135. data/spec/dummy/config/routes.rb +58 -0
  136. data/spec/dummy/config/secrets.yml +22 -0
  137. data/spec/dummy/db/development.sqlite3 +0 -0
  138. data/spec/dummy/lib/assets/.keep +0 -0
  139. data/spec/dummy/public/404.html +67 -0
  140. data/spec/dummy/public/422.html +67 -0
  141. data/spec/dummy/public/500.html +66 -0
  142. data/spec/dummy/public/favicon.ico +0 -0
  143. data/spec/dummy/spec/javascripts/helpers/SpecHelper.coffee +6 -0
  144. data/spec/dummy/spec/javascripts/specs/backbone_install_spec.coffee +78 -0
  145. data/spec/dummy/spec/javascripts/specs/entity_generator_spec.coffee +13 -0
  146. data/spec/dummy/spec/javascripts/specs/view_generator_spec.coffee +44 -0
  147. data/spec/dummy/spec/javascripts/support/jasmine.yml +124 -0
  148. data/spec/dummy/spec/javascripts/support/jasmine_helper.rb +49 -0
  149. data/vendor/assets/javascripts/backbone-syphon.js +469 -0
  150. data/vendor/assets/javascripts/jquery.spin.js +435 -0
  151. metadata +445 -0
@@ -0,0 +1,42 @@
1
+ @Backbone.app.module "Controllers", (Controllers, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Controllers.Application extends Marionette.Controller
4
+
5
+ constructor: (options = {}) ->
6
+ @region = options.region or App.request "default:region"
7
+ super options
8
+ @_instance_id = _.uniqueId("controller")
9
+ App.request "register:instance", @, @_instance_id
10
+
11
+ close: ->
12
+ console.log 'closing', @
13
+ App.request "unregister:instance", @, @_instance_id
14
+ super
15
+
16
+ show: (view, options = {}) ->
17
+ _.defaults options,
18
+ loading: false
19
+ region: @region
20
+ preventDestroy: false
21
+
22
+ @setMainView view
23
+ callback = onShowAllView
24
+ @_manageView view, options, callback
25
+
26
+ setMainView: (view) ->
27
+
28
+ # the first view we show is always going to become the mainView of our
29
+ # controller (whether its a layout or another view type). So if this
30
+ # *is* a layout, when we show other tegions inside of that layout, we
31
+ # check for the existance of a naminView first, so our controller is only
32
+ # closed down when the original mainView is closed.
33
+
34
+ return if @_mainView
35
+ @_mainView = view
36
+ @listenTo view, "close", @close
37
+
38
+ _manageView: (view, options, callback) ->
39
+ if options.loading
40
+ App.request "show:loading", view, options, callback
41
+ else
42
+ options.region.show view, options
@@ -0,0 +1,3 @@
1
+ @Backbone.app.module "Entities", (Entities, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Entities.Collection extends Backbone.Collection
@@ -0,0 +1,40 @@
1
+ @Backbone.app.module "Entities", (Entities, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Entities.Model extends Backbone.Model
4
+
5
+ destroy: (options = {}) ->
6
+ _.defaults options,
7
+ wait: true
8
+
9
+ @set _destroy: true
10
+ super options
11
+
12
+ isDestroyed: ->
13
+ @get "_destroy"
14
+
15
+ save: (data, options = {}) ->
16
+ isNew = @isNew()
17
+
18
+ _.defaults options,
19
+ wait: true
20
+ success: _.bind(@saveSuccess, @, isNew, options.collection)
21
+ error: _.bind(@saveError, @)
22
+
23
+ @unset "_errors"
24
+ super data, options
25
+
26
+ saveSuccess: (isNew, collection) =>
27
+ if isNew
28
+ collection?.add @
29
+ collection?.trigger "model:created", @
30
+ @trigger "created", @
31
+ else
32
+ collection ?= @collection
33
+ ## if model has collection property defined,
34
+ ## use that if no collection option exists
35
+ collection?.trigger "model:updated", @
36
+ @trigger "updated", @
37
+
38
+ saveError: (model, xhr, options) =>
39
+ unless xhr.status is 500 or xhr.status is 404
40
+ @set _errors: $.parseJSON(xhr.responseText)?.errors
@@ -0,0 +1,56 @@
1
+ @Backbone.app.module "Views", (Views, App, Backbone, Marionette, $, _) ->
2
+
3
+ _remove = Marionette.View::remove
4
+
5
+ _.extend Marionette.View::,
6
+
7
+ addOpacityWrapper: (init = true) ->
8
+ @$el.toggleWrapper
9
+ className: "opacity"
10
+ , init
11
+
12
+ setInstancePropertiesFor: (args...) ->
13
+ for key, val of _.pick(@options, args...)
14
+ @[key] = val
15
+
16
+ remove: (args...) ->
17
+ console.log "removing", @ if App.environment == 'development'
18
+ if @model?.isDestroyed?()
19
+
20
+ wrapper = @$el.toggleWrapper
21
+ className: "opacity"
22
+ # backgroundColor: "#FFECEC"
23
+
24
+ wrapper.fadeOut 100, ->
25
+ $(@).remove()
26
+
27
+ @$el.fadeOut 100, =>
28
+ _remove.apply @, args
29
+ else
30
+ _remove.apply @, args
31
+
32
+ templateHelpers: ->
33
+
34
+ linkTo: (name, url, options = {}) ->
35
+ _.defaults options,
36
+ external: false
37
+
38
+ url = "#" + url unless options.external
39
+
40
+ "<a href='#{url}'>#{@escape(name)}</a>"
41
+
42
+
43
+ render_partial: ( path, options = {} ) ->
44
+ # add the leading underscore (like rails-partials)
45
+ path = path.split('/')
46
+ path[ path.length - 1 ] = '_' + path[ path.length - 1 ]
47
+ path = path.join('/')
48
+ # render and return the partial if existing
49
+ try
50
+ JST["backbone/app/templates/#{ path }"]( options )
51
+ catch error
52
+ if App.environment != 'production'
53
+ "<p class='error'>Sorry, there is no partial named '#{ path }'.</p>"
54
+ else
55
+ console.log('error in _view')
56
+ ''
@@ -0,0 +1,4 @@
1
+ @Backbone.app.module "Views", (Views, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Views.CollectionView extends Marionette.CollectionView
4
+ childViewEventPrefix: "childview"
@@ -0,0 +1,4 @@
1
+ @Backbone.app.module "Views", (Views, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Views.CompositeView extends Marionette.CompositeView
4
+ childViewEventPrefix: "childview"
@@ -0,0 +1,3 @@
1
+ @Backbone.app.module "Views", (Views, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Views.ItemView extends Marionette.ItemView
@@ -0,0 +1,3 @@
1
+ @Backbone.app.module "Views", (Views, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Views.Layout extends Marionette.LayoutView
@@ -0,0 +1,72 @@
1
+ do (Backbone) ->
2
+
3
+ _.extend Backbone.Marionette.Application::,
4
+
5
+ navigate: (route, options = { trigger: true }) ->
6
+ # route = "#" + route if route.charAt(0) is "/"
7
+ Backbone.history.navigate route, options
8
+
9
+ getCurrentRoute: ->
10
+ frag = Backbone.history.fragment
11
+ if _.isEmpty(frag) then null else frag
12
+
13
+ startHistory: ->
14
+ if Backbone.history
15
+ Backbone.history.start(
16
+ pushState: true,
17
+ root: "/"
18
+ )
19
+
20
+ do (Marionette) ->
21
+ _.extend Marionette.Renderer,
22
+
23
+ lookups: ["backbone/app/templates/", "backbone/lib/components/"]
24
+
25
+
26
+
27
+ render: (template, data) ->
28
+ return if template is false
29
+ path = @getTemplate(template)
30
+ throw "Template #{template} not found!" unless path
31
+ path(data)
32
+
33
+ getTemplate: (template) ->
34
+ for lookup in @lookups
35
+ ## inserts the template at the '-1' position of the template array
36
+ ## this allows to omit the word 'templates' from the view but still
37
+ ## store the templates in a directory outside of the view
38
+ ## example: "users/list/layout" will become "users/list/templates/layout"
39
+ for path in [template, @withTemplate(template)]
40
+ return JST[lookup + path] if JST[lookup + path]
41
+
42
+ withTemplate: (string) ->
43
+ array = string.split("/")
44
+ array.splice(-1, 0, "templates")
45
+ array.join("/")
46
+
47
+ do ($) ->
48
+ $.fn.toggleWrapper = (obj = {}, init = true) ->
49
+ _.defaults obj,
50
+ className: ""
51
+ backgroundColor: if @css("backgroundColor") isnt "transparent" then @css("backgroundColor") else "white"
52
+ zIndex: if @css("zIndex") is "auto" or 0 then 1000 else (Number) @css("zIndex")
53
+
54
+ $offset = @offset()
55
+ $width = @outerWidth(false)
56
+ $height = @outerHeight(false)
57
+
58
+ if init
59
+ $("<div>")
60
+ .appendTo("body")
61
+ .addClass(obj.className)
62
+ .attr("data-wrapper", true)
63
+ .css
64
+ width: $width
65
+ height: $height
66
+ top: $offset.top
67
+ left: $offset.left
68
+ position: "absolute"
69
+ zIndex: obj.zIndex + 1
70
+ backgroundColor: obj.backgroundColor
71
+ else
72
+ $("[data-wrapper]").remove()
@@ -0,0 +1,55 @@
1
+ @Backbone.app.module "Utilites.Loading", (Loading, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Loading.LoadingController extends App.Controllers.Application
4
+
5
+ initialize: (options) ->
6
+ { view, config } = options
7
+
8
+ config = if _.isBoolean(config) then {} else config
9
+
10
+ _.defaults config,
11
+ loadingType: 'spinner'
12
+ entities: @getEntities(view)
13
+ debug: false
14
+
15
+ switch config.loadingType
16
+ when 'opacity'
17
+ @region.currentView.$el.css '-moz-transition', 'opacity 1s ease-in-out' if @region.hasView()
18
+ @region.currentView.$el.css '-ms-transition', 'opacity 1s ease-in-out' if @region.hasView()
19
+ @region.currentView.$el.css '-o-transition', 'opacity 1s ease-in-out' if @region.hasView()
20
+ @region.currentView.$el.css '-webkit-transition', 'opacity 1s ease-in-out' if @region.hasView()
21
+ @region.currentView.$el.css 'opacity', 0 if @region.hasView()
22
+ when 'spinner'
23
+ loadingView = @getLoadingView()
24
+ @show loadingView
25
+ else
26
+ throw new Error("Invalid loadingType")
27
+
28
+ @showRealView view, loadingView, config, options.callback
29
+
30
+ showRealView: (realView, loadingView, config, callback) ->
31
+ unless callback
32
+ callback = ->
33
+ return false
34
+ App.request 'when:fetched', config.entities, =>
35
+ switch config.loadingType
36
+ when "opacity"
37
+ @region.currentView.$el.removeAttr "style" if @region.hasView()
38
+ when "spinner"
39
+ return realView.close() if @region.currentView isnt loadingView
40
+ callback()
41
+
42
+ @show realView unless config.debug
43
+
44
+ getEntities: (view) ->
45
+ _.chain(view).pick('model', 'collection').toArray().compact().value()
46
+
47
+ getLoadingView: ->
48
+ new Loading.LoadingView
49
+
50
+ App.reqres.setHandler 'show:loading', (view, options, callback) ->
51
+ new Loading.LoadingController
52
+ view: view
53
+ region: options.region
54
+ config: options.loading
55
+ callback: callback
@@ -0,0 +1,30 @@
1
+ @Backbone.app.module "Utilites.Loading", (Loading, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Loading.LoadingView extends App.Views.ItemView
4
+ template: false
5
+ className: 'loading-container'
6
+
7
+ onShow: ->
8
+ opts = @_getOptions()
9
+ @$el.spin opts
10
+
11
+ onClose: ->
12
+ @$el.spin false
13
+
14
+ _getOptions: ->
15
+ lines: 10 # The number of lines to draw
16
+ length: 6 # The length of each line
17
+ width: 2.5 # The line thickness
18
+ radius: 7 # The radius of the inner circle
19
+ corners: 1 # Corner roundness (0..1)
20
+ rotate: 9 # The rotation offset
21
+ direction: 1 # 1: clockwise, -1: counterclockwise
22
+ color: '#000' # #rgb or #rrggbb or array of colors
23
+ speed: 1 # Rounds per second
24
+ trail: 60 # Afterglow percentage
25
+ shadow: false # Whether to render a shadow
26
+ hwaccel: true # Whether to use hardware acceleration
27
+ className: 'spinner' # The CSS class to assign to the spinner
28
+ zIndex: 2e9 # The z-index (defaults to 2000000000)
29
+ top: 'auto' # Top position relative to parent in px
30
+ left: 'auto' # Left position relative to parent in px
@@ -0,0 +1,11 @@
1
+ @Backbone.app.module "Entities", (Entities, App, Backbone, Marionette, $, _) ->
2
+ App.reqres.setHandler "when:fetched", (entities, callback) ->
3
+ xhrs = _.chain([entities]).flatten().pluck("_fetch").value()
4
+
5
+ # if _.isArray(entities)
6
+ # xhrs.push(entity._fetch) for entity in entities
7
+ # else
8
+ # xhrs.push(entities._fetch)
9
+
10
+ $.when(xhrs...).done ->
11
+ callback()
@@ -0,0 +1,19 @@
1
+ do (Backbone) ->
2
+ _sync = Backbone.sync
3
+
4
+ Backbone.sync = (method, entity, options = {}) ->
5
+
6
+ _.defaults options,
7
+ beforeSend: _.bind(methods.beforeSend, entity)
8
+ complete: _.bind(methods.complete, entity)
9
+
10
+ sync = _sync(method, entity, options)
11
+ if !entity._fetch and method is "read"
12
+ entity._fetch = sync
13
+
14
+ methods =
15
+ beforeSend: ->
16
+ @trigger "sync:start", @
17
+
18
+ complete: ->
19
+ @trigger "sync:stop", @
@@ -0,0 +1,9 @@
1
+ <div id="main-region"></div>
2
+
3
+ <%%= javascript_tag do %>
4
+ $(function() {
5
+ Backbone.app.start({
6
+ environment: '<%%= ::Rails.env %>'
7
+ });
8
+ });
9
+ <%% end %>
@@ -0,0 +1,13 @@
1
+ @Backbone.app.module "Router", (Router, App, Backbone, Marionette, $, _) ->
2
+
3
+ class Router extends Marionette.AppRouter
4
+ appRoutes:
5
+ "(/)": "root"
6
+
7
+ API =
8
+ root: ->
9
+ console.log 'Hello world!'
10
+
11
+ App.addInitializer ->
12
+ Backbone.app.router = new Router
13
+ controller: API
@@ -0,0 +1,42 @@
1
+ require 'generators/marionette/resource_helpers'
2
+
3
+ # :nodoc:
4
+ class Marionette::ModelGenerator < Rails::Generators::Base
5
+ include Marionette::ResourceHelpers
6
+ desc %(Description:
7
+ Stubs out a new model - Entity class and EntityCollection class.
8
+ Pass the model name, either CamelCased or
9
+ under_scored, and an optional list of attribute pairs as arguments.
10
+
11
+ Optional list of attribute pairs can be represented as
12
+ javascript object with 'schema' method.
13
+
14
+ Attribute pairs are field:type arguments specifying the
15
+ model's attributes.
16
+
17
+ Example:
18
+ rails g marionette:entity post title:string description:text
19
+ generates entity 'Backbone.app.Entities.All.Post'
20
+ rails g marionette:entity blogs/post
21
+ generates entity 'Backbone.app.Entities.Blogs.Post'
22
+ )
23
+
24
+ source_root File.expand_path('../templates', __FILE__)
25
+
26
+ argument :title, type: :string, required: true, banner: 'Entity'
27
+ argument :schema, type: :hash, default: {}, banner: 'title:string description:text'
28
+
29
+ def vars
30
+ @module = 'All'
31
+ if @title =~ /\//
32
+ parse = @title.match /(.*)\/(.*)/
33
+ @title = parse[2]
34
+ @module = parse[1]
35
+ end
36
+ end
37
+
38
+ def generate_entity
39
+ template 'app/models/entity.js.coffee',
40
+ "#{backbone_path}/app/models/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ @Backbone.app.module "Entities.<%= @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.Entities.Model
4
+ urlRoot: -> '/api/<%= @title.underscore.pluralize %>'
5
+ schema:
6
+ {
7
+ <%- @schema.each_with_index do |val, i| -%>
8
+ <%= val[0] %>: '<%= val[1] %>'<%= (i == @schema.size - 1) ? '' : ',' %>
9
+ <%- end -%>
10
+ }
11
+
12
+ class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %>Collection extends App.Entities.Collection
13
+ model: <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %>
14
+ url: -> '/api/<%= @title.underscore.pluralize %>'