joosy 0.1.0.RC3 → 0.1.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/.gitignore +0 -2
  2. data/Gemfile +2 -13
  3. data/Gemfile.lock +62 -80
  4. data/Guardfile +15 -21
  5. data/MIT-LICENSE +2 -2
  6. data/README.rdoc +3 -0
  7. data/app/helpers/joosy/sprockets_helper.rb +11 -23
  8. data/joosy.gemspec +3 -3
  9. data/lib/joosy/forms.rb +12 -2
  10. data/lib/joosy/rails/engine.rb +1 -9
  11. data/lib/joosy/rails/version.rb +2 -2
  12. data/lib/joosy-rails.rb +5 -0
  13. data/lib/rails/generators/joosy/application_generator.rb +3 -13
  14. data/lib/rails/generators/joosy/joosy_base.rb +2 -2
  15. data/lib/rails/generators/joosy/layout_generator.rb +1 -8
  16. data/lib/rails/generators/joosy/page_generator.rb +6 -21
  17. data/lib/rails/generators/joosy/preloader_generator.rb +7 -14
  18. data/lib/rails/generators/joosy/templates/app/layouts/application.js.coffee +0 -1
  19. data/lib/rails/generators/joosy/templates/app/layouts/template.js.coffee +1 -1
  20. data/lib/rails/generators/joosy/templates/app/pages/application.js.coffee +1 -1
  21. data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +3 -3
  22. data/lib/rails/generators/joosy/templates/app/routes.js.coffee +1 -7
  23. data/lib/rails/generators/joosy/templates/app/widgets/template.js.coffee +2 -2
  24. data/lib/rails/generators/joosy/templates/app.js.coffee +0 -3
  25. data/lib/rails/generators/joosy/templates/app_preloader.js.coffee.erb +12 -9
  26. data/lib/rails/generators/joosy/templates/preload.html.erb +6 -5
  27. data/lib/rails/generators/joosy/templates/preload.html.haml +5 -3
  28. data/lib/rails/generators/joosy/templates/preload.html.slim +21 -0
  29. data/lib/rails/generators/joosy/widget_generator.rb +1 -8
  30. data/spec/javascripts/helpers/spec_helper.js.coffee +0 -20
  31. data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +27 -24
  32. data/spec/javascripts/joosy/core/modules/events_spec.js.coffee +18 -42
  33. data/spec/javascripts/joosy/core/modules/filters_spec.js.coffee +27 -27
  34. data/spec/javascripts/joosy/core/modules/log_spec.js.coffee +3 -3
  35. data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +15 -6
  36. data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +7 -12
  37. data/spec/javascripts/joosy/core/modules/widget_manager_spec.js.coffee +17 -31
  38. data/tmp/javascripts/.gitignore +1 -0
  39. data/tmp/spec/javascripts/helpers/.gitignore +1 -0
  40. data/vendor/assets/javascripts/base64.js +135 -0
  41. data/vendor/assets/javascripts/joosy/core/application.js.coffee +26 -0
  42. data/vendor/assets/javascripts/joosy/core/form.js.coffee +87 -0
  43. data/vendor/assets/javascripts/joosy/core/joosy.js.coffee +62 -0
  44. data/vendor/assets/javascripts/joosy/core/layout.js.coffee +38 -0
  45. data/vendor/assets/javascripts/joosy/core/modules/container.js.coffee +51 -0
  46. data/vendor/assets/javascripts/joosy/core/modules/events.js.coffee +17 -0
  47. data/vendor/assets/javascripts/joosy/core/modules/filters.js.coffee +39 -0
  48. data/vendor/assets/javascripts/joosy/core/modules/log.js.coffee +12 -0
  49. data/vendor/assets/javascripts/joosy/core/modules/module.js.coffee +28 -0
  50. data/vendor/assets/javascripts/joosy/core/modules/time_manager.js.coffee +23 -0
  51. data/vendor/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +45 -0
  52. data/vendor/assets/javascripts/joosy/core/page.js.coffee +136 -0
  53. data/vendor/assets/javascripts/joosy/core/resource/rest.js.coffee +69 -0
  54. data/vendor/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +42 -0
  55. data/vendor/assets/javascripts/joosy/core/router.js.coffee +75 -0
  56. data/vendor/assets/javascripts/joosy/core/widget.js.coffee +35 -0
  57. data/vendor/assets/javascripts/joosy/preloader/development.js.coffee +27 -0
  58. data/vendor/assets/javascripts/joosy/preloader/production.js.coffee +84 -0
  59. data/{app → vendor}/assets/javascripts/joosy.js.coffee +0 -0
  60. data/vendor/assets/javascripts/jquery.form.js +963 -978
  61. data/vendor/assets/javascripts/sugar.js +1 -1
  62. metadata +48 -77
  63. data/.codoopts +0 -5
  64. data/README.md +0 -95
  65. data/app/assets/javascripts/joosy/core/application.js.coffee +0 -50
  66. data/app/assets/javascripts/joosy/core/form.js.coffee +0 -304
  67. data/app/assets/javascripts/joosy/core/helpers/view.js.coffee +0 -30
  68. data/app/assets/javascripts/joosy/core/joosy.js.coffee +0 -129
  69. data/app/assets/javascripts/joosy/core/layout.js.coffee +0 -162
  70. data/app/assets/javascripts/joosy/core/modules/container.js.coffee +0 -104
  71. data/app/assets/javascripts/joosy/core/modules/events.js.coffee +0 -123
  72. data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +0 -67
  73. data/app/assets/javascripts/joosy/core/modules/log.js.coffee +0 -36
  74. data/app/assets/javascripts/joosy/core/modules/module.js.coffee +0 -105
  75. data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +0 -195
  76. data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +0 -46
  77. data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +0 -84
  78. data/app/assets/javascripts/joosy/core/page.js.coffee +0 -375
  79. data/app/assets/javascripts/joosy/core/preloader.js.coffee +0 -13
  80. data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +0 -174
  81. data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +0 -254
  82. data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +0 -197
  83. data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +0 -125
  84. data/app/assets/javascripts/joosy/core/router.js.coffee +0 -163
  85. data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +0 -36
  86. data/app/assets/javascripts/joosy/core/widget.js.coffee +0 -80
  87. data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +0 -169
  88. data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +0 -56
  89. data/lib/joosy.rb +0 -9
  90. data/lib/rails/generators/joosy/resource_generator.rb +0 -29
  91. data/lib/rails/generators/joosy/templates/app/helpers/application.js.coffee +0 -4
  92. data/lib/rails/generators/joosy/templates/app/pages/welcome/index.js.coffee +0 -22
  93. data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +0 -2
  94. data/lib/rails/generators/joosy/templates/app/templates/layouts/application.jst.hamlc +0 -2
  95. data/lib/rails/generators/joosy/templates/app/templates/pages/welcome/index.jst.hamlc +0 -7
  96. data/spec/javascripts/joosy/core/application_spec.js.coffee +0 -40
  97. data/spec/javascripts/joosy/core/form_spec.js.coffee +0 -184
  98. data/spec/javascripts/joosy/core/joosy_spec.js.coffee +0 -72
  99. data/spec/javascripts/joosy/core/layout_spec.js.coffee +0 -50
  100. data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +0 -185
  101. data/spec/javascripts/joosy/core/page_spec.js.coffee +0 -178
  102. data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +0 -84
  103. data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +0 -118
  104. data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +0 -58
  105. data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +0 -129
  106. data/spec/javascripts/joosy/core/router_spec.js.coffee +0 -123
  107. data/spec/javascripts/joosy/core/templaters/rails_jst_spec.js.coffee +0 -25
  108. data/spec/javascripts/joosy/core/widget_spec.js.coffee +0 -40
  109. data/spec/javascripts/joosy/preloaders/caching_spec.js.coffee +0 -36
  110. data/spec/javascripts/joosy/preloaders/inline_spec.js.coffee +0 -16
  111. data/spec/javascripts/support/assets/coolface.jpg +0 -0
  112. data/spec/javascripts/support/assets/okay.jpg +0 -0
  113. data/spec/javascripts/support/assets/test.js +0 -1
  114. data/spec/javascripts/support/sinon-ie-1.3.1.js +0 -82
  115. data/vendor/assets/javascripts/metamorph.js +0 -409
@@ -1,84 +0,0 @@
1
- #
2
- # Widgets management routines
3
- #
4
- # @module
5
- #
6
- Joosy.Modules.WidgetsManager =
7
-
8
- #
9
- # Registeres and runs widget inside specified container
10
- #
11
- # @param [DOM] container jQuery or direct dom node object
12
- # @param [Joosy.Widget] widget Class or object of Joosy.Widget to register
13
- #
14
- registerWidget: (container, widget) ->
15
- if Joosy.Module.hasAncestor widget, Joosy.Widget
16
- widget = new widget()
17
-
18
- @__activeWidgets ||= []
19
- @__activeWidgets.push widget.__load(this, $(container))
20
-
21
- widget
22
-
23
- #
24
- # Unregisteres and destroys widget
25
- #
26
- # @param [Joosy.Widget] widget Object of Joosy.Widget to unregister
27
- #
28
- unregisterWidget: (widget) ->
29
- widget.__unload()
30
-
31
- @__activeWidgets.splice @__activeWidgets.indexOf(widget), 1
32
-
33
- #
34
- # Gathers widgets definitions from current and super classes
35
- #
36
- __collectWidgets: ->
37
- widgets = Object.extended @widgets || {}
38
-
39
- klass = this
40
- while klass = klass.constructor.__super__
41
- Joosy.Module.merge widgets, klass.widgets, false
42
-
43
- widgets
44
-
45
- #
46
- # Intialize all widgets for current object
47
- #
48
- __setupWidgets: ->
49
- widgets = @__collectWidgets()
50
- registered = Object.extended()
51
-
52
- widgets.each (selector, widget) =>
53
- if selector == '$container'
54
- activeSelector = @container
55
- else
56
- if r = selector.match /\$([A-z_]+)/
57
- selector = @elements[r[1]]
58
-
59
- activeSelector = $(selector, @container)
60
-
61
- registered[selector] = Object.extended()
62
-
63
- activeSelector.each (index, elem) =>
64
- if Joosy.Module.hasAncestor widget, Joosy.Widget
65
- instance = new widget
66
- else
67
- instance = widget.call this, index
68
-
69
- registered[selector][Joosy.Module.__className instance] ||= 0
70
- registered[selector][Joosy.Module.__className instance] += 1
71
-
72
- @registerWidget $(elem), instance
73
-
74
- registered.each (selector, value) =>
75
- value.each (widget, count) =>
76
- Joosy.Modules.Log.debugAs @, "Widget #{widget} registered at '#{selector}'. Elements: #{count}"
77
-
78
- #
79
- # Unregister all widgets for current object
80
- #
81
- __unloadWidgets: ->
82
- if @__activeWidgets
83
- for widget in @__activeWidgets
84
- widget.__unload()
@@ -1,375 +0,0 @@
1
- #= require joosy/core/joosy
2
- #= require joosy/core/modules/module
3
- #= require joosy/core/modules/log
4
- #= require joosy/core/modules/events
5
- #= require joosy/core/modules/container
6
- #= require joosy/core/modules/renderer
7
- #= require joosy/core/modules/time_manager
8
- #= require joosy/core/modules/widgets_manager
9
- #= require joosy/core/modules/filters
10
-
11
- #
12
- # Base class for all of your Joosy Pages.
13
- # @see http://guides.joosy.ws/guides/layouts-pages-and-routing.html
14
- #
15
- # @example Sample application page
16
- # class @RumbaPage extends Joosy.Layout
17
- # @view 'rumba'
18
- #
19
- class Joosy.Page extends Joosy.Module
20
- @include Joosy.Modules.Log
21
- @include Joosy.Modules.Events
22
- @include Joosy.Modules.Container
23
- @include Joosy.Modules.Renderer
24
- @include Joosy.Modules.TimeManager
25
- @include Joosy.Modules.WidgetsManager
26
- @include Joosy.Modules.Filters
27
-
28
- #
29
- # Default layout is no layout.
30
- #
31
- layout: false
32
-
33
- #
34
- # Previous page.
35
- #
36
- previous: false
37
-
38
- #
39
- # Route params.
40
- #
41
- params: false
42
-
43
- #
44
- # Prefetched page data.
45
- #
46
- data: false
47
-
48
- #
49
- # Sets layout for current page
50
- #
51
- # @param [Class] layoutClass Layout to use
52
- #
53
- @layout: (layoutClass) ->
54
- @::__layoutClass = layoutClass
55
-
56
- #
57
- # Sets the method which will controll the painting preparation proccess.
58
- #
59
- # This method will be called right ater previous page {Joosy.Page.erase} and in parallel with
60
- # page data fetching so you can use it to initiate preloader.
61
- #
62
- # @note Given method will be called with `complete` function as parameter. As soon as your
63
- # preparations are done you should call that function.
64
- #
65
- # @example Sample before painter
66
- # @beforePaint (complete) ->
67
- # if !@data # checks if parallel fetching finished
68
- # $('preloader').slideDown -> complete()
69
- #
70
- #
71
- @beforePaint: (callback) ->
72
- @::__beforePaint = callback
73
-
74
- #
75
- # Sets the method which will controll the painting proccess.
76
- #
77
- # This method will be called after fetching, erasing and beforePaint is complete.
78
- # It should be used to setup appearance effects of page.
79
- #
80
- # @note Given method will be called with `complete` function as parameter. As soon as your
81
- # preparations are done you should call that function.
82
- #
83
- # @example Sample painter
84
- # @paint (complete) ->
85
- # @container.fadeIn -> complete()
86
- #
87
- @paint: (callback) ->
88
- @::__paint = callback
89
-
90
- #
91
- # @todo Does anybody have idea why we could need this method?
92
- # Looks like something should be removed from here and bootstrap proccess.
93
- #
94
- @afterPaint: (callback) ->
95
- @::__afterPaint = callback
96
-
97
- #
98
- # Sets the method which will controll the erasing proccess.
99
- #
100
- # Use this method to setup hiding effect.
101
- #
102
- # @note Given method will be called with `complete` function as parameter. As soon as your
103
- # preparations are done you should call that function.
104
- #
105
- # @note This method will be caled _before_ unload routines so in theory you can
106
- # access page data from that. Think twice if you are doing it right though.
107
- #
108
- # @example Sample eraser
109
- # @erase (complete) ->
110
- # @container.fadeOut -> complete()
111
- #
112
- @erase: (callback) ->
113
- @::__erase = callback
114
-
115
- #
116
- # Sets the method which will controll the data fetching proccess.
117
- #
118
- # @note Given method will be called with `complete` function as parameter. As soon as your
119
- # preparations are done you should call that function.
120
- #
121
- # @example Basic usage
122
- # @fetch (complete) ->
123
- # $.get '/rumbas', (@data) => complete()
124
- #
125
- @fetch: (callback) ->
126
- @::__fetch = callback
127
-
128
- #
129
- # Sets the several separate methods that will fetch data in parallel.
130
- #
131
- # @note This will work through {Joosy.Modules.Events#synchronize}
132
- #
133
- # @example Basic usage
134
- # @fetchSynchronized (context) ->
135
- # context.do (done) ->
136
- # $.get '/rumbas', (data) =>
137
- # @data.rumbas = data
138
- # done()
139
- #
140
- # context.do (done) ->
141
- # $.get '/kutuzkas', (data) =>
142
- # @data.kutuzkas = data
143
- # done()
144
- #
145
- @fetchSynchronized: (callback) ->
146
- @::__fetch = (complete) ->
147
- @synchronize (context) ->
148
- context.after -> complete()
149
- callback.call(this, context)
150
-
151
- #
152
- # Sets the position where page will be scrolled to after load.
153
- #
154
- # @note If you use animated scroll joosy will atempt to temporarily fix the
155
- # height of your document while scrolling to prevent jump effect.
156
- #
157
- # @param [jQuery] element Element to scroll to
158
- # @param [Hash] options
159
- #
160
- # @option options [Integer] speed Sets the animation duration (500 is default)
161
- # @option options [Integer] margin Defines the margin from element position.
162
- # Can be negative.
163
- #
164
- @scroll: (element, options={}) ->
165
- @::__scrollElement = element
166
- @::__scrollSpeed = options.speed || 500
167
- @::__scrollMargin = options.margin || 0
168
-
169
- #
170
- # Sets the page HTML title.
171
- #
172
- # @note Title will be reverted on unload.
173
- #
174
- # @param [String] title Title to set.
175
- #
176
- @title: (title, separator=' / ') ->
177
- @afterLoad ->
178
- titleStr = if Object.isFunction(title) then title.apply(this) else title
179
- titleStr = titleStr.join(separator) if Object.isArray(titleStr)
180
- @__previousTitle = document.title
181
- document.title = titleStr
182
-
183
- @afterUnload ->
184
- document.title = @__previousTitle
185
-
186
- #
187
- # Constructor is very destructive (c), it calls bootstrap directly so use with caution.
188
- #
189
- # @params [Hash] params Route params
190
- # @params [Joosy.Page] previous Previous page to unload
191
- #
192
- constructor: (@params, @previous) ->
193
- Joosy.Application.loading = true
194
-
195
- @__layoutClass ||= ApplicationLayout
196
-
197
- if @__runBeforeLoads @params, @previous
198
- if !@previous?.layout?.uuid? || @previous?.__layoutClass != @__layoutClass
199
- @__bootstrapLayout()
200
- else
201
- @__bootstrap()
202
-
203
- #
204
- # @see Joosy.Router#navigate
205
- #
206
- navigate: (args...) ->
207
- Joosy.Router.navigate(args...)
208
-
209
- #
210
- # This is required by {Joosy.Modules.Renderer}
211
- # Sets the base template dir to app_name/templates/pages
212
- #
213
- __renderSection: ->
214
- 'pages'
215
-
216
- #
217
- # Freezes the page height through $(html).
218
- #
219
- # Required to implement better {Joosy.Page.scroll} behavior.
220
- #
221
- __fixHeight: ->
222
- $('html').css 'min-height', $(document).height()
223
-
224
- #
225
- # Undo {#__fixHeight}
226
- #
227
- __releaseHeight: ->
228
- $('html').css 'min-height', ''
229
-
230
- #
231
- # Page bootstrap proccess
232
- #
233
- # * {Joosy.Modules.Container#refreshElements}
234
- # * {Joosy.Modules.Container#__delegateEvents}
235
- # * {Joosy.Modules.WidgetsManager#__setupWidgets}
236
- # * {Joosy.Modules.Filters#__runAfterLoads}
237
- # * Scrolling
238
- #
239
- __load: ->
240
- @refreshElements()
241
- @__delegateEvents()
242
- @__setupWidgets()
243
- @__runAfterLoads @params, @previous
244
- if @__scrollElement
245
- scroll = $(@__extractSelector @__scrollElement).offset()?.top + @__scrollMargin
246
- Joosy.Modules.Log.debugAs @, "Scrolling to #{@__extractSelector @__scrollElement}"
247
- $('html, body').animate {scrollTop: scroll}, @__scrollSpeed, =>
248
- if @__scrollSpeed != 0
249
- @__releaseHeight()
250
- Joosy.Application.loading = false
251
- @trigger 'loaded'
252
-
253
- Joosy.Modules.Log.debugAs @, "Page loaded"
254
-
255
- #
256
- # Page destruction proccess.
257
- #
258
- # * {Joosy.Modules.TimeManager#__clearTime}
259
- # * {Joosy.Modules.WidgetsManager#__unloadWidgets}
260
- # * {Joosy.Modules.Renderer#__removeMetamorphs}
261
- # * {Joosy.Modules.Filters#__runAfterUnloads}
262
- #
263
- __unload: ->
264
- @__clearTime()
265
- @__unloadWidgets()
266
- @__removeMetamorphs()
267
- @__runAfterUnloads @params, @previous
268
- delete @previous
269
-
270
- #
271
- # Proxies callback through possible async wrapper.
272
- #
273
- # If wrapper is defined, it will be called with given callback as one of parameters.
274
- # If wrapper is not defined callback will be called directly.
275
- #
276
- # @note Magic People Voodoo People
277
- #
278
- # @param [Object] entity Object possibly containing wrapper method
279
- # @param [String] receiver String name of wrapper method inside entity
280
- # @param [Hash] params Params to send to wrapper, callback will be
281
- # attached as the last of them.
282
- # @param [Function] callback Callback to run
283
- #
284
- __callSyncedThrough: (entity, receiver, params, callback) ->
285
- if entity?[receiver]?
286
- entity[receiver].apply entity, params.clone().add(callback)
287
- else
288
- callback()
289
-
290
- #
291
- # The single page (without layout reloading) bootstrap logic
292
- #
293
- # @example Hacky boot sequence description
294
- # previous::erase \
295
- # previous::unload \
296
- # beforePaint \
297
- # > paint
298
- # fetch /
299
- #
300
- __bootstrap: ->
301
- Joosy.Modules.Log.debugAs @, "Boostraping page"
302
- @layout = @previous.layout
303
-
304
- callbacksParams = [@layout.content()]
305
-
306
- if @__scrollElement && @__scrollSpeed != 0
307
- @__fixHeight()
308
-
309
- @wait "stageClear dataReceived", =>
310
- @__callSyncedThrough this, '__paint', callbacksParams, =>
311
- # Page HTML
312
- @swapContainer @layout.content(), @__renderer(@data || {})
313
- @container = @layout.content()
314
-
315
- # Loading
316
- @__load()
317
-
318
- @layout.content()
319
-
320
- @__callSyncedThrough @previous, '__erase', callbacksParams, =>
321
- @previous?.__unload()
322
- @__callSyncedThrough this, '__beforePaint', callbacksParams, =>
323
- @trigger 'stageClear'
324
-
325
- @__callSyncedThrough this, '__fetch', [], =>
326
- Joosy.Modules.Log.debugAs @, "Fetch complete"
327
- @trigger 'dataReceived'
328
-
329
- #
330
- # The page+layout bootstrap logic
331
- #
332
- # @example Hacky boot sequence description
333
- # previous::erase \
334
- # previous::unload \
335
- # beforePaint \
336
- # > paint
337
- # fetch /
338
- #
339
- __bootstrapLayout: ->
340
- Joosy.Modules.Log.debugAs @, "Boostraping page with layout"
341
- @layout = new @__layoutClass(@params)
342
-
343
- callbacksParams = [Joosy.Application.content(), this]
344
-
345
- if @__scrollElement && @__scrollSpeed != 0
346
- @__fixHeight()
347
-
348
- @wait "stageClear dataReceived", =>
349
- @__callSyncedThrough @layout, '__paint', callbacksParams, =>
350
- # Layout HTML
351
- data = Joosy.Module.merge {}, @layout.data || {}
352
- data = Joosy.Module.merge data, yield: => @layout.yield()
353
-
354
- @swapContainer Joosy.Application.content(), @layout.__renderer data
355
-
356
- # Page HTML
357
- @swapContainer @layout.content(), @__renderer(@data || {})
358
- @container = @layout.content()
359
-
360
- # Loading
361
- @layout.__load Joosy.Application.content()
362
- @__load()
363
-
364
- Joosy.Application.content()
365
-
366
- @__callSyncedThrough @previous?.layout, '__erase', callbacksParams, =>
367
- @previous?.layout?.__unload?()
368
- @previous?.__unload()
369
- @__callSyncedThrough @layout, '__beforePaint', callbacksParams, =>
370
- @trigger 'stageClear'
371
-
372
- @__callSyncedThrough @layout, '__fetch', [], =>
373
- @__callSyncedThrough this, '__fetch', [], =>
374
- Joosy.Modules.Log.debugAs @, "Fetch complete"
375
- @trigger 'dataReceived'
@@ -1,13 +0,0 @@
1
- #
2
- # Preloader stub
3
- #
4
- # @module
5
- #
6
- @Preloader =
7
-
8
- #
9
- # Mocks loader to do nothing if Joosy is already here
10
- #
11
- load: (libraries, options) ->
12
- @[key] = val for key, val of options
13
- @complete?.call window
@@ -1,174 +0,0 @@
1
- #
2
- # Basic collection of Resources.
3
- # Turns JSON array into array of Resources and manages them.
4
- #
5
- # @note You should not use Collection directly. It will be
6
- # automatically created by things like {Joosy.Resource.Generic.map}
7
- # or {Joosy.Resource.REST.find}.
8
- #
9
- # @example Basic sample
10
- # class R extends Joosy.Resource.Generic
11
- # @entity 'r'
12
- #
13
- # collection = new Joosy.Resource.Collection(R)
14
- #
15
- # collection.reset [{foo: 'bar'}, {foo: 'baz'}]
16
- # collection.each (resource) ->
17
- # resource('foo')
18
- #
19
- class Joosy.Resource.Collection extends Joosy.Module
20
- @include Joosy.Modules.Events
21
-
22
- #
23
- # Allows to modify data before it gets stored
24
- #
25
- # @note Supposed to be used in descendants
26
- #
27
- # @param [Function] action `(Object) -> Object` to call
28
- #
29
- @beforeLoad: (action) -> @::__beforeLoad = action
30
-
31
- #
32
- # Sets the default model for collection
33
- #
34
- # @note Supposed to be used in descendants
35
- #
36
- # @param [Class] model Model class
37
- #
38
- @model: (model) -> @::model = model
39
-
40
- #
41
- # Modelized data storage
42
- #
43
- data: []
44
-
45
- #
46
- # If model param was empty it will fallback to `@model`
47
- # If both param and `@model` were empty it will throw an exception.
48
- #
49
- # @param [Class] model Resource class which this collection will handle
50
- #
51
- constructor: (model=false) ->
52
- @model = model if model
53
-
54
- if !@model
55
- throw new Error "#{Joosy.Module.__className @}> model can't be empty"
56
-
57
- #
58
- # Clears the storage and attempts to import given array
59
- #
60
- # @param [Array, Hash] entities Array of entities to import.
61
- # If hash was given will seek for moodel name camelized and pluralized.
62
- # @param [Boolean] notify Indicates whether to trigger 'changed' event
63
- #
64
- # @return [Joosy.Resource.Collection] Returns self.
65
- #
66
- reset: (entities, notify=true) ->
67
- if @__beforeLoad?
68
- entities = @__beforeLoad entities
69
-
70
- @data = @modelize entities
71
-
72
- if notify
73
- @trigger 'changed'
74
- this
75
-
76
- #
77
- # Turns Objects array into array of Resources
78
- #
79
- # @param [Array] collection Array of Objects
80
- #
81
- modelize: (collection) ->
82
- root = @model::__entityName.pluralize()
83
-
84
- if collection not instanceof Array
85
- collection = collection?[root.camelize(false)]
86
-
87
- if collection not instanceof Array
88
- throw new Error "Can not read incoming JSON"
89
-
90
- collection.map (x) =>
91
- @model.create x
92
-
93
- #
94
- # Calls callback for each Resource inside Collection
95
- #
96
- # @param [Function] callback `(mixed) -> mixed` to call for each Resource in collection
97
- #
98
- each: (callback) ->
99
- @data.each callback
100
-
101
- #
102
- # Returns number of Resources inside Collection
103
- #
104
- size: ->
105
- @data.length
106
-
107
- #
108
- # Gets first resource matching description (see Sugar.js Array#find)
109
- #
110
- # @param [Function] description Callback matcher
111
- #
112
- # @return [Joosy.Resource.Generic]
113
- #
114
- find: (description) ->
115
- @data.find description
116
-
117
- #
118
- # Gets resource by id
119
- #
120
- # @param [Integer] id Id to find
121
- #
122
- # @return [Joosy.Resource.Generic]
123
- #
124
- findById: (id) ->
125
- @data.find (x) -> x('id').toString() == id.toString()
126
-
127
- #
128
- # Gets resource by its index inside collection
129
- #
130
- # @param [Integer] i Index
131
- #
132
- # @return [Joosy.Resource.Generic]
133
- #
134
- at: (i) ->
135
- @data[i]
136
-
137
- #
138
- # Removes resource from collection by its index or by === comparison
139
- #
140
- # @param [Integer] target Index
141
- # @param [Resource] target Resource by itself
142
- # @param [Boolean] notify Indicates whether to trigger 'changed' event
143
- #
144
- # @return [Joosy.Resource.Generic] Removed element
145
- #
146
- remove: (target, notify=true) ->
147
- if Object.isNumber target
148
- index = target
149
- else
150
- index = @data.indexOf target
151
- if index >= 0
152
- result = @data.splice(index, 1)[0]
153
- if notify
154
- @trigger 'changed'
155
- result
156
-
157
- #
158
- # Adds resource to collection to given index or to the end
159
- #
160
- # @param [Resource] element Resource to add
161
- # @param [Integer] index Index to add to. If omited will be pushed to the end
162
- # @param [Boolean] notify Indicates whether to trigger 'changed' event
163
- #
164
- # @return [Joosy.Resource.Generic] Added element
165
- #
166
- add: (element, index=false, notify=true) ->
167
- if index
168
- @data.splice index, 0, element
169
- else
170
- @data.push element
171
-
172
- if notify
173
- @trigger 'changed'
174
- element