ende 0.4.24 → 0.4.25

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,14 +1,13 @@
1
-
2
1
  'use strict';
3
2
 
4
- lazy_requires = ['observable', 'advisable']
3
+ lazy_require = 'advisable'
5
4
  define [
6
5
  './states/index',
7
6
  './presenters/default',
8
7
  'jquery.inview',
9
8
  'stampit/stampit',
10
- lazy_requires[0],
11
- lazy_requires[1]], (templates, presenter, inview, stampit, observable, advisable) ->
9
+ 'observable',
10
+ lazy_require], (templates, presenter, inview, stampit, observable, advisable) ->
12
11
 
13
12
  scopable = (widget) ->
14
13
  deferred = widget.sandbox.data.deferred()
@@ -30,6 +29,7 @@ define [
30
29
 
31
30
  return unless total_pages?
32
31
 
32
+ # TODO set default abortion to decreatse page numbers amount
33
33
  scope.page ++page_number
34
34
 
35
35
  if page_number <= total_pages
@@ -64,7 +64,7 @@ define [
64
64
  scrolled: ->
65
65
  @widget.sandbox.emit "#{@widget.name}.#{@widget.identifier}.flip" if @bottoned()
66
66
  ,
67
- buffer: 800
67
+ buffer: 400
68
68
  , ->
69
69
  @scroll_container = $ window
70
70
 
@@ -126,7 +126,32 @@ define [
126
126
  viewed: (event, in_view, horizontal, vertical) ->
127
127
  boo[if in_view then 'pride' else 'shame'] event.target
128
128
 
129
- version: '0.2.1'
129
+
130
+ # TODO Move each handler to independent features
131
+ handleable = stampit
132
+ handleables:
133
+ item:
134
+ hover: (event, models) ->
135
+ if event.type == 'mouseenter'
136
+ @hover models.item
137
+ else if event.type == 'mouseleave'
138
+ @hover null
139
+ else
140
+ throw new TypeError 'viewer.handlers.hover: Event type incompatible with hovering.'
141
+
142
+ clicked: (event, models) -> @select models.item
143
+
144
+ , {}, ->
145
+
146
+ throw new TypeError "Widget property is mandatory for handleable stamp" unless @widget?
147
+
148
+ @handlers =
149
+ item:
150
+ clicked: $.proxy @handleables.item.clicked, @widget
151
+ hover : $.proxy @handleables.item.hover , @widget
152
+
153
+ @
154
+ version: '0.2.4'
130
155
 
131
156
  # TODO better separation of concerns
132
157
  # TODO Current remote page that is beign displayed
@@ -157,8 +182,16 @@ define [
157
182
  # We extend presentation.selected just to assign all values of the item model
158
183
  # TODO call presenter to do this job
159
184
  @sandbox.util.extend @presentation.selected , item.model.json?() || item.model
185
+
186
+ # TODO change paramters to item, item.model
160
187
  @sandbox.emit "viewer.#{@identifier}.selected", item.model
161
188
 
189
+ # Called when hover in and out from model
190
+ hover: (item) ->
191
+ # TODO call presenter to do this job
192
+ # @sandbox.util.extend @presentation.hovered , item.model.json?() || item.model
193
+ @sandbox.emit "viewer.#{@identifier}.hovered", item, item && item.model
194
+
162
195
  scope_to: (scope, child_scope) ->
163
196
  # Singuralize in order to accept association scopes, since
164
197
  # association scopes return almost the same kind as of it's
@@ -166,16 +199,14 @@ define [
166
199
  sent_scope = @inflector.singularize scope.resource.toString()
167
200
  current_scope = @inflector.singularize @scope.resource.toString()
168
201
 
202
+ deferred = @sandbox.data.deferred()
203
+
169
204
  if sent_scope != current_scope
170
205
  throw new TypeError "Invalid scope sent to viewer@#{@identifier} sent: '#{sent_scope}', expected: '#{current_scope}'"
171
206
 
172
207
  # For sobsequent usages we must store the scope
173
208
  @scope = scope
174
209
 
175
- # TODO better hierachical event distribution
176
- for { _widget: widget } in @sandbox._children?
177
- widget.scope_to? child_scope
178
-
179
210
  @sandbox.emit "viewer.#{@identifier}.scope_changed", @scope
180
211
 
181
212
  # TODO better scope data binding, and updating
@@ -185,6 +216,15 @@ define [
185
216
 
186
217
  @repopulate()
187
218
 
219
+ # TODO rename this method
220
+ # TODO also move this to an external tag
221
+ statused: (status) ->
222
+ if status
223
+ @status = status
224
+ @sandbox.emit "viewer.#{@identifier}.status_changed", status
225
+ else
226
+ @status
227
+
188
228
  repopulate: ->
189
229
  unless @fetching?
190
230
  if @load?
@@ -195,9 +235,10 @@ define [
195
235
 
196
236
  # TODO store spinner instance, instead of creating a new one every time
197
237
  unless @load?
198
- @load = @sandbox.ui.loader @$el.find '.results .items'
238
+ @load = @sandbox.ui.loader @$results
199
239
 
200
240
  # TODO implement status for viewer widget
241
+ @statused 'loading'
201
242
  @$el.addClass 'idle'
202
243
  @$el.removeClass 'loading'
203
244
 
@@ -212,12 +253,9 @@ define [
212
253
  records = _.map records, @resource, @resource unless records[0]?.resource or records[0]?.itemable
213
254
 
214
255
  # TODO implement Array.concat ou Array.merge in observer, and
215
- # use it here instead of pushing each record
256
+ # use it here instead of overriding all records
216
257
  viewer.items = records
217
258
 
218
- # Start widgets created by bindings
219
- @syncronize_children()
220
-
221
259
  @fetching.done (records) =>
222
260
  if viewer.items.length
223
261
  # boo.initialize @$el.find '.results .items'
@@ -231,21 +269,20 @@ define [
231
269
  @sandbox.emit "viewer.#{@identifier}.populated", records, @
232
270
 
233
271
  @fetching.always =>
234
- # TODO implement status for viewer widget
235
- @$el.addClass 'idle'
236
- @$el.removeClass 'loading'
237
-
238
272
  if @load?
239
273
  @load.stop()
240
274
  @load = null
241
275
 
276
+ # TODO implement status for viewer widget
277
+ @$el.removeClass 'loading'
278
+ @statused 'idle'
279
+ @$el.addClass 'idle'
242
280
 
243
- populate: (handlers) ->
244
- sandbox = @sandbox
245
-
246
- @load = @sandbox.ui.loader @$results
281
+ populate: ->
282
+ @load = @sandbox.ui.loader @$el
247
283
 
248
284
  # TODO implement status for viewer widget
285
+ @statused 'loading'
249
286
  @$el.removeClass 'idle'
250
287
  @$el.addClass 'loading'
251
288
 
@@ -270,9 +307,12 @@ define [
270
307
 
271
308
  @load.stop()
272
309
 
273
- @presentation = @presenter records, @scope
310
+ # TODO do not send records as parameter
311
+ @presentation = @presenter records, @scope, @handleable
274
312
 
313
+ # Initialize elements
275
314
  @$el.html templates[@options.resource]
315
+ @$results = @$el.find '.results .items'
276
316
 
277
317
  if records.length
278
318
  # boo.initialize @$el.find '.results .items'
@@ -282,7 +322,14 @@ define [
282
322
 
283
323
  # TODO move binders to application
284
324
  @inherit_parent_presentation()
285
- @bind @presentation, @presenter.presentation
325
+ # TODO on bind execute presentation_options method and extend and inherit from presenter what needed
326
+ @bind @presentation, @sandbox.util.extend(true, @presenter.presentation, @options.presentation)
327
+
328
+ @presentation.viewer.subscribe 'items', =>
329
+ # Start possible widgets created by items with widget
330
+ # instantiation markup
331
+ @syncronize_children()
332
+
286
333
 
287
334
  # Start widgets that may have been created by bindings
288
335
  @sandbox.emit 'aura.sandbox.start', @sandbox
@@ -299,7 +346,7 @@ define [
299
346
 
300
347
 
301
348
  plugins: (options) ->
302
- deferreds = []
349
+ deferreds = [@]
303
350
 
304
351
  deferreds.push paginable widget: @ if options.page
305
352
  deferreds.push scrollable widget: @ if options.scroll
@@ -310,6 +357,7 @@ define [
310
357
  # TODO move this method to an extension
311
358
  syncronize_children: ->
312
359
  @sandbox._children ||= []
360
+ @sandbox._widget ||= @
313
361
 
314
362
  # Add possible new childs
315
363
  @constructor.startAll(@$el).done (widgets...) =>
@@ -319,6 +367,12 @@ define [
319
367
 
320
368
  @sandbox._children = @sandbox._children.concat widgets
321
369
 
370
+ for widget in widgets
371
+ # TODO emit this event only when all siblings have initialized
372
+ @sandbox.emit "#{widget.name}.#{widget.identifier}.siblings_initialized", @sandbox._children
373
+
374
+ true
375
+
322
376
  # TODO better internal aura widget selection
323
377
  # Prevent other child to be instantiated
324
378
  @$el.find('[data-aura-widget]').each (i, element) ->
@@ -402,43 +456,56 @@ define [
402
456
  initialize: (options) ->
403
457
  # TODO import core extensions in another place
404
458
  @resource = @sandbox.resource options.resource
405
- @scope = model = @resource
459
+ @scope = @resource
460
+
461
+ # Instantiate it's on handleable factory
462
+ widget = @
463
+ widgetable = stampit().enclose -> @widget = widget; @
464
+ @handleable = stampit.compose widgetable, handleable
406
465
 
407
466
  {sandbox: {util: {@inflector}}} = @
408
467
 
409
468
  @sandbox.on "viewer.#{@identifier}.scope", @scope_to, @
410
469
 
411
- # Iniitalize plugins
470
+ # Initalize plugins
471
+ # TODO think how to implement plugins api
412
472
  loading = @plugins options
413
473
 
474
+ @statused 'idle'
414
475
  @$el.addClass "viewer widget #{@inflector.cssify @identifier} idle clearfix"
415
476
 
416
- loading.done => @require_custom options
477
+ loading.done (widget) ->
478
+ widget.require_custom options.resource
479
+
480
+ # TODO externalize this code to an extension
481
+ require_custom: (resource) ->
482
+ deferred = @sandbox.data.deferred()
417
483
 
418
- require_custom: (options) ->
419
484
  # Fetch custom templates
420
485
  # TODO better custom templates structure and custom presenter
421
486
  # TODO better segregation of concerns on this code
422
487
  # TODO handle case where custom presenter does not exist!
423
488
  require [
424
- "text!./widgets/viewer/templates/default/#{options.resource}.html"
425
- "./widgets/viewer/presenters/#{options.resource}"
489
+ "text!./widgets/viewer/templates/default/#{resource}.html"
490
+ "./widgets/viewer/presenters/#{resource}"
426
491
  ], (custom_default_template, custom_presenter) =>
427
492
 
428
- # TODO Better way to preserve widgets handlers
429
- handlers =
430
- item:
431
- clicked: (event, models) =>
432
- @select models.item
493
+ unless presenter.hasOwnProperty 'handlers'
494
+ Object.defineProperty presenter, 'handlers',
495
+ get: -> throw new Error "presenter.hanlder is deprecated, please compose upon handleable"
496
+ set: -> throw new Error "presenter.hanlder is deprecated, please compose upon handleable"
433
497
 
434
- presenter.handlers = handlers
498
+ custom_default_template and templates[resource] = custom_default_template
499
+ @presenter = @sandbox.util.extend custom_presenter, presenter if custom_presenter
435
500
 
436
- custom_default_template and templates[options.resource] = custom_default_template
437
- @presenter = @sandbox.util.extend custom_presenter, presenter if custom_presenter
501
+ # Fetch default data
502
+ @populate()
438
503
 
439
- @$results = @$el.find '.results .items'
504
+ deferred.resolveWith @, [resource]
440
505
 
441
- # Fetch default data
442
- @populate handlers
506
+ , (error) =>
507
+ # TODO handle other status codes with xhr error
508
+ @sandbox.logger.error "Error when loading presenter and template for resource '#{resource}':\n\n", error.message + "\n\n", error
509
+ deferred.rejectWith @, arguments
443
510
 
444
- true
511
+ deferred
data/lib/ende/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ende
2
- VERSION = "0.4.24"
2
+ VERSION = "0.4.25"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ende
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.24
4
+ version: 0.4.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heitor Salazar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-03 00:00:00.000000000 Z
11
+ date: 2014-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,8 +82,12 @@ files:
82
82
  - lib/assets/javascripts/aura/extensions/rivets/formatters.js.coffee
83
83
  - lib/assets/javascripts/aura/extensions/routes.js.coffee
84
84
  - lib/assets/javascripts/aura/extensions/screening.js.coffee
85
+ - lib/assets/javascripts/aura/extensions/stamps.js.coffee
86
+ - lib/assets/javascripts/aura/extensions/stamps/stampit.js
85
87
  - lib/assets/javascripts/aura/extensions/states.js.coffee
88
+ - lib/assets/javascripts/aura/extensions/widget/composable.js.coffee
86
89
  - lib/assets/javascripts/aura/extensions/widget/eventable.js.coffee
90
+ - lib/assets/javascripts/aura/extensions/widget/flowable.js.coffee
87
91
  - lib/assets/javascripts/aura/extensions/widget/lifecycleable.js.coffee
88
92
  - lib/assets/javascripts/aura/extensions/widget/napable.js.coffee
89
93
  - lib/assets/javascripts/aura/extensions/widget/presentable.js.coffee