luca 0.9.4 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/CHANGELOG +41 -1
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +2 -0
  4. data/README.md +5 -0
  5. data/Rakefile +4 -0
  6. data/assets/javascripts/dependencies/underscore-min.js +5 -31
  7. data/assets/javascripts/luca-templates.js +1 -0
  8. data/assets/javascripts/luca-ui-base.coffee +1 -1
  9. data/assets/javascripts/luca-ui-development-tools.coffee +1 -1
  10. data/assets/javascripts/luca-ui-full.js +1 -1
  11. data/assets/javascripts/luca-ui-spec.coffee +1 -1
  12. data/assets/javascripts/luca-ui.js +3 -0
  13. data/assets/javascripts/luca/index.coffee +1 -0
  14. data/lib/generators/luca/application/application_generator.rb +71 -0
  15. data/lib/generators/luca/application/templates/controller.rb +6 -0
  16. data/lib/generators/luca/application/templates/index.html.erb +7 -0
  17. data/lib/generators/luca/application/templates/index.html.haml +6 -0
  18. data/lib/generators/luca/application/templates/javascripts/application.js +28 -0
  19. data/lib/generators/luca/application/templates/javascripts/application.js.coffee +20 -0
  20. data/lib/generators/luca/application/templates/javascripts/config.js +15 -0
  21. data/lib/generators/luca/application/templates/javascripts/config.js.coffee +9 -0
  22. data/lib/generators/luca/application/templates/javascripts/dependencies.js +5 -0
  23. data/lib/generators/luca/application/templates/javascripts/dependencies.js.coffee +5 -0
  24. data/lib/generators/luca/application/templates/javascripts/index.js +9 -0
  25. data/lib/generators/luca/application/templates/javascripts/index.js.coffee +9 -0
  26. data/lib/generators/luca/application/templates/javascripts/main.js +8 -0
  27. data/lib/generators/luca/application/templates/javascripts/main.js.coffee +3 -0
  28. data/lib/generators/luca/application/templates/javascripts/main.jst.ejs +1 -0
  29. data/lib/generators/luca/application/templates/javascripts/router.js +12 -0
  30. data/lib/generators/luca/application/templates/javascripts/router.js.coffee +7 -0
  31. data/lib/luca/rails/version.rb +1 -1
  32. data/lib/luca/template.rb +1 -1
  33. data/spec/components/collection_view_spec.coffee +37 -0
  34. data/spec/components/multi_collection_view_spec.coffee +5 -0
  35. data/spec/components/table_view_spec.coffee +17 -0
  36. data/spec/core/container_spec.coffee +112 -5
  37. data/spec/core/model_spec.coffee +21 -3
  38. data/spec/define_spec.coffee +19 -0
  39. data/spec/mixin_spec.coffee +49 -0
  40. data/src/components/application.coffee +33 -19
  41. data/src/components/collection_view.coffee +109 -38
  42. data/src/components/fields/checkbox_field.coffee +2 -2
  43. data/src/components/fields/file_upload_field.coffee +0 -3
  44. data/src/components/fields/hidden_field.coffee +0 -3
  45. data/src/components/fields/label_field.coffee +1 -4
  46. data/src/components/fields/select_field.coffee +6 -6
  47. data/src/components/fields/text_area_field.coffee +1 -0
  48. data/src/components/fields/text_field.coffee +4 -0
  49. data/src/components/fields/type_ahead_field.coffee +5 -9
  50. data/src/components/form_view.coffee +2 -0
  51. data/src/components/index.coffee +1 -0
  52. data/src/components/multi_collection_view.coffee +94 -0
  53. data/src/components/pagination_control.coffee +100 -0
  54. data/src/components/table_view.coffee +62 -0
  55. data/src/containers/card_view.coffee +44 -11
  56. data/src/containers/panel_toolbar.coffee +88 -82
  57. data/src/containers/tab_view.coffee +3 -3
  58. data/src/containers/viewport.coffee +10 -4
  59. data/src/core/collection.coffee +11 -4
  60. data/src/core/container.coffee +189 -113
  61. data/src/core/field.coffee +13 -10
  62. data/src/core/model.coffee +23 -27
  63. data/src/core/registry.coffee +48 -35
  64. data/src/core/view.coffee +60 -140
  65. data/src/define.coffee +91 -19
  66. data/src/framework.coffee +10 -8
  67. data/src/index.coffee +23 -0
  68. data/src/managers/collection_manager.coffee +24 -8
  69. data/src/modules/application_event_bindings.coffee +19 -0
  70. data/src/modules/collection_event_bindings.coffee +26 -0
  71. data/src/modules/deferrable.coffee +3 -1
  72. data/src/modules/dom_helpers.coffee +49 -0
  73. data/src/modules/enhanced_properties.coffee +23 -0
  74. data/src/modules/filterable.coffee +60 -0
  75. data/src/modules/grid_layout.coffee +15 -0
  76. data/src/modules/{load_mask.coffee → loadmaskable.coffee} +10 -4
  77. data/src/modules/modal_view.coffee +38 -0
  78. data/src/modules/paginatable.coffee +79 -0
  79. data/src/modules/state_model.coffee +16 -0
  80. data/src/modules/templating.coffee +8 -0
  81. data/src/plugins/events.coffee +30 -2
  82. data/src/templates/components/bootstrap_form_controls.jst.ejs +10 -0
  83. data/src/templates/components/collection_loader_view.jst.ejs +6 -0
  84. data/src/templates/components/form_alert.jst.ejs +4 -0
  85. data/src/templates/components/grid_view.jst.ejs +11 -0
  86. data/src/templates/components/grid_view_empty_text.jst.ejs +3 -0
  87. data/src/templates/components/load_mask.jst.ejs +5 -0
  88. data/src/templates/components/nav_bar.jst.ejs +4 -0
  89. data/src/templates/components/pagination.jst.ejs +10 -0
  90. data/src/templates/containers/basic.jst.ejs +1 -0
  91. data/src/templates/containers/tab_selector_container.jst.ejs +12 -0
  92. data/src/templates/containers/tab_view.jst.ejs +2 -0
  93. data/src/templates/containers/toolbar_wrapper.jst.ejs +1 -0
  94. data/src/templates/fields/button_field.jst.ejs +2 -0
  95. data/src/templates/fields/button_field_link.jst.ejs +6 -0
  96. data/src/templates/fields/checkbox_array.jst.ejs +4 -0
  97. data/src/templates/fields/checkbox_array_item.jst.ejs +3 -0
  98. data/src/templates/fields/checkbox_field.jst.ejs +10 -0
  99. data/src/templates/fields/file_upload_field.jst.ejs +10 -0
  100. data/src/templates/fields/hidden_field.jst.ejs +1 -0
  101. data/src/templates/fields/select_field.jst.ejs +11 -0
  102. data/src/templates/fields/text_area_field.jst.ejs +11 -0
  103. data/src/templates/fields/text_field.jst.ejs +16 -0
  104. data/src/templates/table_view.jst.ejs +4 -0
  105. data/src/tools/console.coffee +51 -21
  106. data/src/util.coffee +17 -4
  107. data/vendor/assets/javascripts/luca-ui-base.js +3288 -613
  108. data/vendor/assets/javascripts/luca-ui-development-tools.js +49 -21
  109. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +1 -1
  110. data/vendor/assets/javascripts/luca-ui-full.js +1704 -554
  111. data/vendor/assets/javascripts/luca-ui-full.min.js +7 -6
  112. data/vendor/assets/javascripts/luca-ui-spec.js +1783 -830
  113. data/vendor/assets/javascripts/luca-ui-templates.js +92 -0
  114. data/vendor/assets/javascripts/luca-ui.js +1694 -523
  115. data/vendor/assets/javascripts/luca-ui.min.js +4 -4
  116. metadata +69 -31
  117. data/assets/javascripts/luca-ui.coffee +0 -3
  118. data/src/luca.coffee +0 -22
  119. data/src/templates/components/bootstrap_form_controls.luca +0 -7
  120. data/src/templates/components/collection_loader_view.luca +0 -5
  121. data/src/templates/components/form_alert +0 -0
  122. data/src/templates/components/form_alert.luca +0 -3
  123. data/src/templates/components/grid_view.luca +0 -7
  124. data/src/templates/components/grid_view_empty_text.luca +0 -3
  125. data/src/templates/components/load_mask.luca +0 -3
  126. data/src/templates/components/nav_bar.luca +0 -2
  127. data/src/templates/containers/basic.luca +0 -1
  128. data/src/templates/containers/tab_selector_container.luca +0 -8
  129. data/src/templates/containers/tab_view.luca +0 -2
  130. data/src/templates/containers/toolbar_wrapper.luca +0 -1
  131. data/src/templates/fields/button_field.luca +0 -2
  132. data/src/templates/fields/button_field_link.luca +0 -5
  133. data/src/templates/fields/checkbox_array.luca +0 -4
  134. data/src/templates/fields/checkbox_array_item.luca +0 -4
  135. data/src/templates/fields/checkbox_field.luca +0 -9
  136. data/src/templates/fields/file_upload_field.luca +0 -8
  137. data/src/templates/fields/hidden_field.luca +0 -1
  138. data/src/templates/fields/select_field.luca +0 -8
  139. data/src/templates/fields/text_area_field.luca +0 -8
  140. data/src/templates/fields/text_field.luca +0 -17
  141. data/src/templates/sample/contents.luca +0 -1
  142. data/src/templates/sample/welcome.luca +0 -1
  143. data/vendor/assets/javascripts/luca-spec-dependencies.js +0 -6135
  144. data/vendor/assets/javascripts/luca-ui-development-dependencies.js +0 -12845
@@ -27,15 +27,21 @@ _.def('Luca.core.Field').extends('Luca.View').with
27
27
  @input_id ||= _.uniqueId('field')
28
28
  @input_name ||= @name
29
29
  @input_class ||= ""
30
+ @input_type ||= ""
30
31
  @helperText ||= ""
31
32
  @label ||= "*#{ @label }" if @required and not @label?.match(/^\*/)
32
33
  @inputStyles ||= ""
34
+ @input_value ||= @value || ""
33
35
 
34
36
  @disable() if @disabled
35
37
 
36
38
  @updateState( @state )
37
39
  @placeHolder ||= ""
38
40
 
41
+ # In order to support using Luca.View template properties everywhere.
42
+
43
+ # Will need to work around how the field classes
44
+ # apply templates to themselves.
39
45
  Luca.View::initialize.apply(@, arguments)
40
46
 
41
47
  beforeRender: ()->
@@ -44,20 +50,17 @@ _.def('Luca.core.Field').extends('Luca.View').with
44
50
 
45
51
  @$el.addClass('required') if @required
46
52
 
47
- @$el.html Luca.template(@template, @)
48
- @input = $('input', @el)
49
-
50
53
  change_handler: (e)->
51
54
  @trigger "on:change", @, e
52
55
 
53
56
  disable: ()->
54
- $("input",@el).attr('disabled', true)
57
+ @getInputElement().attr('disabled', true)
55
58
 
56
59
  enable: ()->
57
- $("input", @el).attr('disabled', false)
60
+ @getInputElement().attr('disabled', false)
58
61
 
59
62
  getValue: ()->
60
- raw = @input.attr('value')
63
+ raw = @getInputElement()?.attr('value')
61
64
 
62
65
  return raw if _.str.isBlank( raw )
63
66
 
@@ -67,11 +70,11 @@ _.def('Luca.core.Field').extends('Luca.View').with
67
70
  when "float" then parseFloat(raw)
68
71
  else raw
69
72
 
70
- render: ()->
71
- $( @container ).append( @$el )
72
-
73
73
  setValue: (value)->
74
- @input.attr('value', value)
74
+ @getInputElement()?.attr('value', value)
75
+
76
+ getInputElement: ()->
77
+ @input ||= @$('input').eq(0)
75
78
 
76
79
  updateState: (state)->
77
80
  _( @statuses ).each (cls)=>
@@ -1,16 +1,26 @@
1
- # Computed Properties Support
2
- # ###
3
- #
4
- # Luca.Model supports computed properties, which are
5
- # object methods which are composed of model attributes or
6
- # of calculations which are dependent on these attributes.
7
-
8
- # When these model attributes change, the computed property
9
- # needs to be re-evaluated.
10
- #
11
- # The configuration API for computed properties expects a hash
12
- # whose keys are the name of the method, and whose value is
13
- # an array of the attribute dependencies for that method.
1
+ model = Luca.define 'Luca.Model'
2
+
3
+ model.extends 'Backbone.Model'
4
+
5
+ model.includes 'Luca.Events'
6
+
7
+ model.defines
8
+ initialize: ()->
9
+ Backbone.Model::initialize(@, arguments)
10
+ setupComputedProperties.call(@)
11
+
12
+ read: (attr)->
13
+ if _.isFunction(@[attr])
14
+ @[attr].call(@)
15
+ else
16
+ @get(attr)
17
+
18
+ get: (attr)->
19
+ if @computed?.hasOwnProperty(attr)
20
+ @_computed[attr]
21
+ else
22
+ Backbone.Model::get.call @, attr
23
+
14
24
  setupComputedProperties = ()->
15
25
  return if _.isUndefined(@computed)
16
26
 
@@ -27,17 +37,3 @@ setupComputedProperties = ()->
27
37
  @trigger "change:#{attr}"
28
38
 
29
39
  @trigger "change:#{attr}" if @has(dep)
30
-
31
-
32
- _.def('Luca.Model').extends('Backbone.Model').with
33
- include: ['Luca.Events']
34
-
35
- initialize: ()->
36
- Backbone.Model::initialize @, arguments
37
- setupComputedProperties.call(@)
38
-
39
- get: (attr)->
40
- if @computed?.hasOwnProperty(attr)
41
- @_computed[attr]
42
- else
43
- Backbone.Model::get.call @, attr
@@ -4,26 +4,41 @@ registry =
4
4
  collection_classes: {}
5
5
  namespaces:['Luca.containers','Luca.components']
6
6
 
7
- component_cache =
7
+ componentCacheStore =
8
8
  cid_index: {}
9
9
  name_index: {}
10
10
 
11
11
  # For container views, if a component is defined with no ctype
12
12
  # then we will pick this one when using
13
- Luca.defaultComponentType = 'view'
13
+ Luca.config.defaultComponentClass = Luca.defaultComponentClass = 'Luca.View'
14
+ Luca.config.defaultComponentType = Luca.defaultComponentType = 'view'
15
+
16
+ Luca.registry.aliases =
17
+ grid: "grid_view"
18
+ form: "form_view"
19
+ text: "text_field"
20
+ button: "button_field"
21
+ select: "select_field"
22
+ card: "card_view"
23
+ paged: "card_view"
24
+ wizard: "card_view"
25
+ collection: "collection_view"
26
+ list: "collection_view"
27
+ multi: "collection_multi_view"
28
+ table: "table_view"
14
29
 
15
30
 
16
31
  # When you use _.def to define a component, you say
17
32
  # which class it extends() from, and with() which enhancements.
18
33
  # We register that component class for you:
19
- Luca.register = (component, prototypeName, componentType="view")->
34
+ Luca.registerComponent = (component, prototypeName, componentType="view")->
20
35
  Luca.trigger "component:registered", component, prototypeName
21
36
 
22
37
  switch componentType
23
38
  when "model"
24
39
  registry.model_classes[ component ] = prototypeName
25
40
  when "collection"
26
- registry.model_classes[ component ] = prototypeName
41
+ registry.collection_classes[ component ] = prototypeName
27
42
  else
28
43
  registry.classes[ component ] = prototypeName
29
44
 
@@ -38,7 +53,7 @@ Luca.development_mode_register = (component, prototypeName)->
38
53
  _( liveInstances ).each (instance)->
39
54
  instance?.refreshCode?.call(instance, prototypeDefinition)
40
55
 
41
- Luca.register( component, prototypeName )
56
+ Luca.registerComponent( component, prototypeName )
42
57
 
43
58
  # We create a @ctype alias for this component definition, and register
44
59
  # the class in a registry.
@@ -46,7 +61,7 @@ Luca.development_mode_register = (component, prototypeName)->
46
61
  # If you use a custom namespace like MyApp.views.ListView,
47
62
  # then we will register MyApp.views as a namespace. You can
48
63
  # do this yourself too.
49
- Luca.registry.addNamespace = (identifier)->
64
+ Luca.registry.addNamespace = Luca.registry.namespace = (identifier)->
50
65
  registry.namespaces.push( identifier )
51
66
  registry.namespaces = _( registry.namespaces ).uniq()
52
67
 
@@ -61,16 +76,7 @@ Luca.registry.namespaces = (resolve=true)->
61
76
  _( registry.namespaces ).map (namespace)->
62
77
  if resolve then Luca.util.resolve( namespace ) else namespace
63
78
 
64
- Luca.registry.aliases =
65
- grid: "grid_view"
66
- form: "form_view"
67
- text: "text_field"
68
- button: "button_field"
69
- select: "select_field"
70
- card: "card_view"
71
- paged: "card_view"
72
- wizard: "card_view"
73
- collection: "collection_view"
79
+
74
80
 
75
81
  # Lookup a component in the Luca component registry
76
82
  # by it's ctype identifier. If it doesn't exist,
@@ -87,15 +93,22 @@ Luca.registry.lookup = (ctype)->
87
93
 
88
94
  parents = Luca.registry.namespaces()
89
95
 
90
- fullPath = _( parents ).chain().map((parent)->
91
- parent[className]).compact().value()?[0]
96
+ fullPath = _( parents ).chain().map (parent)->
97
+ parent[className]
98
+ .compact().value()?[0]
92
99
 
93
100
  Luca.registry.instances = ()->
94
- _( component_cache.cid_index ).values()
95
-
101
+ _( componentCacheStore.cid_index ).values()
102
+
103
+ Luca.registry.findInstancesByClass = (componentClass)->
104
+ Luca.registry.findInstancesByClassName( componentClass.displayName )
105
+
96
106
  Luca.registry.findInstancesByClassName = (className)->
107
+ className = className.displayName if not _.isString( className )
97
108
  instances = Luca.registry.instances()
98
109
  _( instances ).select (instance)->
110
+ isClass = instance.displayName is className
111
+
99
112
  instance.displayName is className or instance._superClass?()?.displayName is className
100
113
 
101
114
  Luca.registry.classes = (toString=false)->
@@ -106,24 +119,24 @@ Luca.registry.classes = (toString=false)->
106
119
  className: className
107
120
  ctype: ctype
108
121
 
109
- Luca.cache = (needle, component)->
110
- component_cache.cid_index[ needle ] = component if component?
122
+ Luca.cache = Luca.cacheInstance = (cacheKey, object)->
123
+ return unless cacheKey?
124
+ return object if object?.doNotCache is true
111
125
 
112
- component = component_cache.cid_index[ needle ]
126
+ if object?
127
+ componentCacheStore.cid_index[ cacheKey ] = object
113
128
 
114
- # optionally, cache it by tying its name to its cid for easier lookups
115
- if component?.component_name?
116
- Luca.trigger "component:created:#{ component.component_name }", component
117
- component_cache.name_index[ component.component_name ] = component.cid
118
- else if component?.name?
119
- Luca.trigger "component:created:#{ component.component_name }", component
120
- component_cache.name_index[ component.name ] = component.cid
129
+ object = componentCacheStore.cid_index[ cacheKey ]
121
130
 
122
- return component if component?
123
-
124
- # perform a lookup by name if the component_id didn't turn anything
125
- lookup_id = component_cache.name_index[ needle ]
131
+ # optionally, cache it by tying its name to its cid for easier lookups
132
+ if object?.component_name?
133
+ componentCacheStore.name_index[ object.component_name ] = object.cid
134
+ else if object?.name?
135
+ componentCacheStore.name_index[ object.name ] = object.cid
126
136
 
127
- component_cache.cid_index[ lookup_id ]
137
+ return object if object?
128
138
 
139
+ # perform a lookup by name if the cid lookup didn't turn anything
140
+ lookup_id = componentCacheStore.name_index[ cacheKey ]
129
141
 
142
+ componentCacheStore.cid_index[ lookup_id ]
data/src/core/view.coffee CHANGED
@@ -1,100 +1,61 @@
1
- _.def("Luca.View").extends("Backbone.View").with
2
- include: ['Luca.Events']
3
-
4
- additionalClassNames:[]
5
-
6
- hooks:[
7
- "after:initialize"
8
- "before:render"
9
- "after:render"
10
- "first:activation"
11
- "activation"
12
- "deactivation"
13
- ]
14
-
1
+ view = Luca.register "Luca.View"
2
+
3
+ view.extends "Backbone.View"
4
+
5
+ # includes are extensions to the prototype, and have no special behavior
6
+ view.includes "Luca.Events",
7
+ "Luca.modules.DomHelpers"
8
+
9
+ # mixins are includes with special property / method conventions
10
+ # which customize the components through the use of __initializer and
11
+ # __included method names. These will be called every time an instance
12
+ # is created, and the first time the mixin is used to enhance a component.
13
+ view.mixesIn "DomHelpers",
14
+ "Templating",
15
+ "EnhancedProperties",
16
+ "CollectionEventBindings",
17
+ "ApplicationEventBindings",
18
+ "StateModel"
19
+
20
+ # Luca.View classes have the concept of special events called hooks
21
+ # which allow you to tap into the lifecycle events of your view to
22
+ # customize their behavior. This is especially useful in subclasses.
23
+ #
24
+ # You can utilize a @hook method by camelcasing the triggers defined below:
25
+ view.triggers "before:initialize",
26
+ "after:initialize",
27
+ "before:render",
28
+ "after:render",
29
+ "first:activation",
30
+ "activation",
31
+ "deactivation"
32
+
33
+ # Luca.View decorates Backbone.View with some patterns and conventions.
34
+ view.defines
15
35
  initialize: (@options={})->
16
36
  @trigger "before:initialize", @, @options
17
37
 
18
38
  _.extend @, @options
19
39
 
20
- @cid = _.uniqueId(@name) if @name?
40
+ if @autoBindEventHandlers is true or @bindAllEvents is true
41
+ bindAllEventHandlers.call(@)
21
42
 
22
- templateVars = if @bodyTemplateVars
23
- @bodyTemplateVars.call(@)
24
- else
25
- @
26
-
27
- if template = @bodyTemplate
28
- @$el.empty()
29
- Luca.View::$html.call(@, Luca.template(template, templateVars ) )
43
+ @cid = _.uniqueId(@name) if @name?
30
44
 
31
- Luca.cache( @cid, @ )
45
+ @$el.attr("data-luca-id", @name || @cid)
46
+
47
+ Luca.cacheInstance( @cid, @ )
32
48
 
33
49
  @setupHooks _( Luca.View::hooks.concat( @hooks ) ).uniq()
34
50
 
35
- bindAllEventHandlers.call(@) if @autoBindEventHandlers is true or @bindAllEvents is true
36
-
37
- if @additionalClassNames
38
- @additionalClassNames = @additionalClassNames.split(" ") if _.isString(@additionalClassNames)
39
-
40
- if @gridSpan
41
- @additionalClassNames.push "span#{ @gridSpan }"
42
-
43
- if @gridOffset
44
- @additionalClassNames.push "offset#{ @gridOffset }"
45
-
46
- if @gridRowFluid
47
- @additionalClassNames.push "row-fluid"
48
-
49
- if @gridRow
50
- @additionalClassNames.push "row"
51
-
52
- if @additionalClassNames?.length > 0
53
- @$el.addClass( additional ) for additional in @additionalClassNames
54
-
55
- @$wrap( @wrapperClass ) if @wrapperClass?
56
-
57
- registerCollectionEvents.call(@)
58
- registerApplicationEvents.call( @)
51
+ if @mixins?.length > 0
52
+ for module in @mixins
53
+ Luca.mixin(module)?.__initializer?.call(@, @, module)
59
54
 
60
55
  @delegateEvents()
61
56
 
62
- if @stateful is true and not @state?
63
- @state = new Backbone.Model(@defaultState || {})
64
- unless @set?
65
- @set = _.bind @, @state.set
66
- @get = _.bind @, @state.get
67
-
68
- if @mixins?.length > 0
69
- for module in @mixins
70
- Luca.modules[ module ]._included.call(@, @, module)
71
-
72
57
  @trigger "after:initialize", @
73
58
 
74
- $wrap: (wrapper)->
75
- if _.isString(wrapper) and not wrapper.match(/[<>]/)
76
- wrapper = @make("div",class:wrapper)
77
-
78
- @$el.wrap( wrapper )
79
-
80
- $template: (template, variables={})->
81
- @$el.html( Luca.template(template,variables) )
82
-
83
- $html: (content)->
84
- @$el.html( content )
85
-
86
- $append: (content)->
87
- @$el.append( content )
88
-
89
- $attach: ()->
90
- @$container().append( @el )
91
-
92
- $bodyEl: ()->
93
- @$el
94
-
95
- $container: ()->
96
- $(@container)
97
-
98
59
  #### Hooks or Auto Event Binding
99
60
  #
100
61
  # views which inherit from Luca.View can define hooks
@@ -114,12 +75,12 @@ _.def("Luca.View").extends("Backbone.View").with
114
75
  _(set).each (eventId)=>
115
76
  fn = Luca.util.hook( eventId )
116
77
 
117
- callback = ()=>
78
+ callback = ()->
118
79
  @[fn]?.apply @, arguments
119
80
 
120
81
  callback = _.once(callback) if eventId?.match(/once:/)
121
82
 
122
- @bind eventId, callback
83
+ @on eventId, callback, @
123
84
 
124
85
  registerEvent: (selector, handler)->
125
86
  @events ||= {}
@@ -146,9 +107,9 @@ _.def("Luca.View").extends("Backbone.View").with
146
107
  Backbone.View.prototype.trigger.apply @, arguments
147
108
 
148
109
 
149
- originalExtend = Backbone.View.extend
110
+ Luca.View._originalExtend = Backbone.View.extend
150
111
 
151
- customizeRender = (definition)->
112
+ Luca.View.renderWrapper = (definition)->
152
113
  _base = definition.render
153
114
 
154
115
  _base ||= Luca.View::$attach
@@ -164,7 +125,7 @@ customizeRender = (definition)->
164
125
  @deferrable = @collection
165
126
 
166
127
  target ||= @deferrable
167
- trigger = if @deferrable_event then @deferrable_event else "reset"
128
+ trigger = if @deferrable_event then @deferrable_event else Luca.View.deferrableEvent
168
129
 
169
130
  deferred = ()->
170
131
  _base.call(view)
@@ -194,63 +155,22 @@ customizeRender = (definition)->
194
155
  definition
195
156
 
196
157
  bindAllEventHandlers = ()->
197
- _( @events ).each (handler,event)=>
198
- if _.isString(handler)
199
- _.bindAll @, handler
200
-
201
- registerApplicationEvents = ()->
202
- return if _.isEmpty(@applicationEvents)
203
-
204
- app = @app
205
-
206
- if _.isString( app ) or _.isUndefined( app )
207
- app = Luca.Application?.get?(app)
208
-
209
- unless Luca.supportsEvents( app )
210
- throw "Error binding to the application object on #{ @name || @cid }"
211
-
212
- for eventTrigger, handler in @applicationEvents
213
- handler = @[handler] if _.isString(handler)
214
-
215
- unless _.isFunction(handler)
216
- throw "Error registering application event #{ eventTrigger } on #{ @name || @cid }"
217
-
218
- app.on(eventTrigger, handler)
219
-
220
- registerCollectionEvents = ()->
221
- return if _.isEmpty( @collectionEvents )
222
-
223
- manager = @collectionManager
224
-
225
- if _.isString( manager ) or _.isUndefined( manager )
226
- manager = Luca.CollectionManager.get( manager )
227
-
228
- for signature, handler of @collectionEvents
229
- console.log "Sig", signature, "Handler", handler
230
- [key,eventTrigger] = signature.split(" ")
231
-
232
- collection = manager.getOrCreate( key )
233
-
234
- if !collection
235
- throw "Could not find collection specified by #{ key }"
158
+ for config in [@events, @componentEvents, @collectionEvents, @applicationEvents] when not _.isEmpty(config)
159
+ bindEventHandlers.call(@, config)
236
160
 
161
+ bindEventHandlers = (events={})->
162
+ for eventSignature, handler of events
237
163
  if _.isString(handler)
238
- handler = @[handler]
239
-
240
- unless _.isFunction(handler)
241
- throw "invalid collectionEvents configuration"
242
-
243
- try
244
- collection.bind(eventTrigger, handler)
245
- catch e
246
- console.log "Error Binding To Collection in registerCollectionEvents", @
247
- throw e
248
-
164
+ _.bindAll @, handler
249
165
 
250
166
  Luca.View.extend = (definition)->
251
- definition = customizeRender( definition )
167
+ definition = Luca.View.renderWrapper( definition )
252
168
 
253
169
  if definition.mixins? and _.isArray( definition.mixins )
254
- _.extend(definition, Luca.modules[module]) for module in definition.mixins
170
+ for module in definition.mixins
171
+ Luca.decorate( definition ).with( module )
172
+
173
+ Luca.View._originalExtend.call(@, definition)
174
+
255
175
 
256
- originalExtend.call(@, definition)
176
+ Luca.View.deferrableEvent = "reset"