luca 0.9.4 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -31,7 +31,7 @@ _.def('Luca.fields.CheckboxField').extends('Luca.core.Field').with
31
31
  @label ||= @name
32
32
 
33
33
  setValue: (checked)->
34
- @input.attr('checked', checked)
34
+ @getInputElement().attr('checked', checked)
35
35
 
36
36
  getValue:()->
37
- @input.is(":checked")
37
+ @getInputElement().is(":checked")
@@ -2,9 +2,6 @@ _.def('Luca.fields.FileUploadField').extends('Luca.core.Field').with
2
2
 
3
3
  template: 'fields/file_upload_field'
4
4
 
5
- initialize: (@options={})->
6
- Luca.core.Field::initialize.apply @, arguments
7
-
8
5
  afterInitialize: ()->
9
6
  @input_id ||= _.uniqueId('field')
10
7
  @input_name ||= @name
@@ -2,9 +2,6 @@ _.def('Luca.fields.HiddenField').extends('Luca.core.Field').with
2
2
 
3
3
  template: 'fields/hidden_field'
4
4
 
5
- initialize: (@options={})->
6
- Luca.core.Field::initialize.apply @, arguments
7
-
8
5
  afterInitialize: ()->
9
6
  @input_id ||= _.uniqueId('field')
10
7
  @input_name ||= @name
@@ -1,14 +1,11 @@
1
1
  _.def("Luca.components.LabelField").extends("Luca.core.Field").with
2
2
  className: "luca-ui-field luca-ui-label-field"
3
3
 
4
- getValue: ()->
5
- @$('input').attr('value')
6
-
7
4
  formatter: (value)->
8
5
  value ||= @getValue()
9
6
  _.str.titleize( value )
10
7
 
11
8
  setValue: (value)->
12
9
  @trigger("change", value, @getValue())
13
- @$('input').attr('value', value)
10
+ @getInputElement().attr('value', value)
14
11
  @$('.value').html( @formatter(value) )
@@ -57,9 +57,10 @@ _.def('Luca.fields.SelectField').extends('Luca.core.Field').with
57
57
 
58
58
  hash
59
59
 
60
- afterRender: ()->
61
- @input = $('select', @el)
60
+ getInputElement: ()->
61
+ @input ||= @$('select').eq(0)
62
62
 
63
+ afterRender: ()->
63
64
  if @collection?.models?.length > 0
64
65
  @populateOptions()
65
66
  else
@@ -76,11 +77,10 @@ _.def('Luca.fields.SelectField').extends('Luca.core.Field').with
76
77
  @trigger "on:change", @, e
77
78
 
78
79
  resetOptions: ()->
79
- @input.html('')
80
+ @getInputElement().html('')
80
81
 
81
82
  if @includeBlank
82
- @input.append("<option value='#{ @blankValue }'>#{ @blankText }</option>")
83
-
83
+ @getInputElement().append("<option value='#{ @blankValue }'>#{ @blankText }</option>")
84
84
 
85
85
  populateOptions: ()->
86
86
  @resetOptions()
@@ -91,7 +91,7 @@ _.def('Luca.fields.SelectField').extends('Luca.core.Field').with
91
91
  display = model.get( @displayField )
92
92
  selected = "selected" if @selected and value is @selected
93
93
  option = "<option #{ selected } value='#{ value }'>#{ display }</option>"
94
- @input.append( option )
94
+ @getInputElement().append( option )
95
95
 
96
96
  @trigger "after:populate:options", @
97
97
  @setValue( @currentValue )
@@ -19,6 +19,7 @@ _.def('Luca.fields.TextAreaField').extends('Luca.core.Field').with
19
19
  @input_name ||= @name
20
20
  @label ||= @name
21
21
  @input_class ||= @class
22
+ @input_value ||= ""
22
23
  @inputStyles ||= "height:#{ @height };width:#{ @width }"
23
24
 
24
25
  setValue: (value)->
@@ -21,7 +21,11 @@ _.def('Luca.fields.TextField').extends('Luca.core.Field').with
21
21
  @input_name ||= @name
22
22
  @label ||= @name
23
23
  @input_class ||= @class
24
+ @input_value ||= @value || ""
24
25
 
26
+ # TODO
27
+ # Placeholder?
28
+
25
29
  if @prepend
26
30
  @$el.addClass('input-prepend')
27
31
  @addOn = @prepend
@@ -2,21 +2,17 @@ _.def('Luca.fields.TypeAheadField').extends('Luca.fields.TextField').with
2
2
  className: 'luca-ui-field'
3
3
 
4
4
  getSource: ()->
5
- return @source.call(@) if _.isFunction(@source)
6
- @source || []
5
+ Luca.util.read(@source) || []
7
6
 
8
7
  matcher: (item)->
9
- # IMPLEMENT
10
- # return true where item matches @query
11
8
  true
12
9
 
13
10
  beforeRender: ()->
14
- @_super("beforeRender", @, arguments)
15
- @$('input').attr('data-provide','typeahead')
11
+ Luca.fields.TextField::beforeRender.apply(@, arguments)
12
+ @getInputElement().attr('data-provide','typeahead')
16
13
 
17
14
  afterRender: ()->
18
- @_super("afterRender", @, arguments)
19
-
20
- @$('input').typeahead
15
+ Luca.fields.TextField::afterRender.apply(@, arguments)
16
+ @getInputElement().typeahead
21
17
  matcher: @matcher
22
18
  source: @getSource()
@@ -54,6 +54,8 @@ _.def("Luca.components.FormView").extends('Luca.core.Container').with
54
54
 
55
55
  Luca.core.Container::initialize.apply @, arguments
56
56
 
57
+ @components ||= @fields
58
+
57
59
  _.bindAll @, "submitHandler", "resetHandler", "renderToolbars", "applyLoadMask"
58
60
 
59
61
  @state ||= new Backbone.Model
@@ -0,0 +1 @@
1
+ #= require_tree .
@@ -0,0 +1,94 @@
1
+ multiView = Luca.define "Luca.components.MultiCollectionView"
2
+
3
+ # The CollectionMultiView is a collection view with multiple renderings
4
+ # of the list. ( e.g. Icons, Table, List ). It works by maintaining
5
+ # a current view, and rendering that view. It refreshes the views
6
+ # whenever they are activated.
7
+ #
8
+ # The MultiView allows you to share one collection, filter, pagination setup
9
+ # but render multiple versions of a model. To do this, you are expected to
10
+ # define one or more objects in the @views property of the component.
11
+
12
+ # Example:
13
+ # multiView = new Luca.components.MultiCollectionView
14
+ # collection: "my_collection"
15
+ # paginatable:
16
+ # page: 1
17
+ # limit: 20
18
+ # views:[
19
+ # type: "table"
20
+ # columns:[
21
+ # header: "Header"
22
+ # reader: "attribute"
23
+ # ]
24
+ # ]
25
+ multiView.extends "Luca.containers.CardView"
26
+
27
+ multiView.behavesAs "LoadMaskable",
28
+ "Filterable",
29
+ "Paginatable"
30
+
31
+ multiView.triggers "before:refresh",
32
+ "after:refresh",
33
+ "refresh",
34
+ "empty:results"
35
+
36
+ multiView.defaultsTo
37
+ version: 1
38
+
39
+ stateful: true
40
+
41
+ defaultState:
42
+ activeView: 0
43
+
44
+ viewContainerClass: "luca-ui-multi-view-container"
45
+
46
+ initialize: (@options={})->
47
+ @components ||= @views
48
+
49
+ validateComponent( view ) for view in @components
50
+
51
+ @on "collection:change", @refresh, @
52
+ @on "after:card:switch", @refresh, @
53
+ @on "before:components", propagateCollectionComponents, @
54
+ @on "after:components", bubbleCollectionEvents, @
55
+
56
+ Luca.containers.CardView::initialize.apply(@, arguments)
57
+
58
+ refresh: ()->
59
+ @activeComponent()?.trigger("refresh")
60
+
61
+ getQuery: Luca.components.CollectionView::getQuery
62
+ getQueryOptions: Luca.components.CollectionView::getQueryOptions
63
+ getCollection: Luca.components.CollectionView::getCollection
64
+
65
+ #### Private Helpers
66
+
67
+ bubbleCollectionEvents = ()->
68
+ container = @
69
+ container.eachComponent (component)->
70
+ for eventId in ['refresh','before:refresh','after:refresh','empty:results']
71
+ component.on eventId, ()->
72
+ if component is container.activeComponent()
73
+ container.trigger(eventId)
74
+
75
+ propagateCollectionComponents = ()->
76
+ container = @
77
+
78
+ # in the multi view will share the same
79
+ # collection, filter state, pagination options, etc
80
+ for component in @components
81
+ _.extend component,
82
+ collection: container.getCollection?() || @collection
83
+ getQuery: container.getQuery
84
+ getQueryOptions: container.getQueryOptions
85
+
86
+ validateComponent = (component)->
87
+ type = (component.type || component.ctype)
88
+
89
+ return if type is "collection" or
90
+ type is "collection_view" or
91
+ type is "table" or
92
+ type is "table_view"
93
+
94
+ throw "The MultiCollectionView expects to contain multiple collection views"
@@ -0,0 +1,100 @@
1
+ paginationControl = Luca.register "Luca.components.PaginationControl"
2
+
3
+ paginationControl.extends "Luca.View"
4
+
5
+ paginationControl.defines
6
+ template: "components/pagination"
7
+
8
+ stateful: true
9
+
10
+ autoBindEventHandlers: true
11
+
12
+ events:
13
+ "click a[data-page-number]" : "selectPage"
14
+ "click a.next" : "nextPage"
15
+ "click a.prev" : "previousPage"
16
+
17
+ afterInitialize: ()->
18
+ _.bindAll @, "refresh"
19
+
20
+ @state.on("change", @refresh, @)
21
+
22
+ limit: ()->
23
+ parseInt (@state.get('limit') || @collection?.length)
24
+
25
+ page: ()->
26
+ parseInt (@state.get('page') || 1)
27
+
28
+ nextPage: ()->
29
+ return unless @nextEnabled()
30
+ @state.set('page', @page() + 1 )
31
+
32
+ previousPage: ()->
33
+ return unless @previousEnabled()
34
+ @state.set('page', @page() - 1 )
35
+
36
+ selectPage: (e)->
37
+ me = my = @$( e.target )
38
+ me = my = my.closest('a.page') unless me.is('a.page')
39
+
40
+ my.siblings().removeClass('is-selected')
41
+ me.addClass('is-selected')
42
+
43
+ @setPage( my.data('page-number') )
44
+
45
+ setPage: (page=1,options={})->
46
+ @state.set('page', page, options)
47
+
48
+ setLimit: (limit=1,options={})->
49
+ @state.set('limit', limit, options)
50
+
51
+ pageButtonContainer: ()->
52
+ @$ '.group'
53
+
54
+ previousEnabled: ()->
55
+ @page() > 1
56
+
57
+ nextEnabled: ()->
58
+ @page() < @totalPages()
59
+
60
+ previousButton: ()->
61
+ @$ 'a.page.prev'
62
+
63
+ nextButton: ()->
64
+ @$ 'a.page.next'
65
+
66
+ pageButtons: ()->
67
+ @$ 'a[data-page-number]', @pageButtonContainer()
68
+
69
+ refresh: ()->
70
+ @pageButtonContainer().empty()
71
+
72
+ for page in [1..@totalPages()]
73
+ button = @make("a","data-page-number":page, class:"page", page )
74
+ @pageButtonContainer().append(button)
75
+
76
+ @toggleNavigationButtons()
77
+ @selectActivePageButton()
78
+
79
+ @
80
+
81
+ toggleNavigationButtons: ()->
82
+ @$('a.next, a.prev').addClass('disabled')
83
+ @nextButton().removeClass('disabled') if @nextEnabled()
84
+ @previousButton().removeClass('disabled') if @previousEnabled()
85
+
86
+ selectActivePageButton: ()->
87
+ @activePageButton().addClass('is-selected')
88
+
89
+ activePageButton: ()->
90
+ @pageButtons().filter("[data-page-number='#{ @page() }']")
91
+
92
+ totalPages: ()->
93
+ parseInt( Math.ceil(@totalItems() / @itemsPerPage()) )
94
+
95
+ totalItems: ()->
96
+ parseInt @collection?.length || 0
97
+
98
+ itemsPerPage: (value, options={})->
99
+ @state.set("limit", value, options) if value?
100
+ parseInt @state.get("limit")
@@ -0,0 +1,62 @@
1
+ # Public: TableView renders collection data into an HTML table.
2
+ _.def("Luca.components.TableView").extends("Luca.components.CollectionView").with
3
+ additionalClassNames: "table"
4
+ tagName: "table"
5
+ bodyTemplate: "table_view"
6
+ bodyTagName: "tbody"
7
+ bodyClassName: "table-body"
8
+ itemTagName: "tr"
9
+ stateful: true
10
+ observeChanges: true
11
+
12
+ columns:[]
13
+
14
+ emptyText: "There are no results to display"
15
+
16
+ itemRenderer: (item, model)->
17
+ Luca.components.TableView.rowRenderer.call(@, item, model)
18
+
19
+ initialize: (@options={})->
20
+ Luca.components.CollectionView::initialize.apply(@, arguments)
21
+
22
+ @columns = for column in @columns
23
+ if _.isString(column)
24
+ column = reader: column
25
+
26
+ if !column.header?
27
+ column.header = _.str.titleize(_.str.humanize(column.reader))
28
+
29
+ column
30
+
31
+ @defer ()=>
32
+ Luca.components.TableView.renderHeader.call(@, @columns, @$('thead') )
33
+ .until("after:render")
34
+
35
+ make = Backbone.View::make
36
+
37
+ Luca.components.TableView.renderHeader = (columns, targetElement)->
38
+ index = 0
39
+
40
+ content = for column in columns
41
+ "<th data-col-index='#{ index++ }'>#{ column.header }</th>"
42
+
43
+ @$( targetElement ).append("<tr>#{ content.join('') }</tr>")
44
+
45
+ index = 0
46
+
47
+ for column in columns when column.width?
48
+ @$("th[data-col-index='#{ index++ }']",targetElement).css('width', column.width)
49
+
50
+
51
+ Luca.components.TableView.rowRenderer = (item, model, index)->
52
+ colIndex = 0
53
+ for columnConfig in @columns
54
+ Luca.components.TableView.renderColumn.call(@, columnConfig, item, model, colIndex++)
55
+
56
+ Luca.components.TableView.renderColumn = (column, item, model, index)->
57
+ cellValue = model.read( column.reader )
58
+
59
+ if _.isFunction( column.renderer )
60
+ cellValue = column.renderer.call @, cellValue, model, column
61
+
62
+ make("td", {"data-col-index":index}, cellValue)
@@ -1,5 +1,28 @@
1
- _.def("Luca.containers.CardView").extends("Luca.core.Container").with
2
- componentType: 'card_view'
1
+ component = Luca.define "Luca.containers.CardView"
2
+ component.extends "Luca.core.Container"
3
+ #
4
+ # The CardView is a type of Container which has many sub-views
5
+ # which are only going to be visible one at a time. A CardView
6
+ # allows you to @activate() its cards, navigate through them using
7
+ # @next(), @previous(), @cycle()
8
+ #
9
+ # Example:
10
+ # cardView = new Luca.containers.CardView
11
+ # cards:[
12
+ # getter: "getCardOne"
13
+ # type: "my_component"
14
+ # name: "one"
15
+ # ,
16
+ # getter: "getCardTwo"
17
+ # type: "my_component"
18
+ # name: "two"
19
+ # ]
20
+ #
21
+ # cardView.activeComponent().name # => "one"
22
+ # cardView.activate('two')
23
+ # cardView.activeComponent().name # => "two"
24
+ #
25
+ component.defaults
3
26
 
4
27
  className: 'luca-ui-card-view-wrapper'
5
28
 
@@ -18,15 +41,12 @@ _.def("Luca.containers.CardView").extends("Luca.core.Container").with
18
41
  initialize: (@options)->
19
42
  Luca.core.Container::initialize.apply @,arguments
20
43
  @setupHooks(@hooks)
44
+ @components ||= @pages ||= @cards
21
45
 
22
46
  prepareComponents: ()->
23
47
  Luca.core.Container::prepareComponents?.apply(@, arguments)
24
-
25
- _( @components ).each (component,index)=>
26
- if index is @activeCard
27
- $( component.container ).show()
28
- else
29
- $( component.container ).hide()
48
+ @componentElements().hide()
49
+ @activeComponentElement().show()
30
50
 
31
51
  activeComponentElement: ()->
32
52
  @componentElements().eq( @activeCard )
@@ -39,12 +59,25 @@ _.def("Luca.containers.CardView").extends("Luca.core.Container").with
39
59
 
40
60
  containerEl
41
61
 
62
+ atFirst: ()->
63
+ @activeCard is 0
64
+
65
+ atLast: ()->
66
+ @activeCard is @components.length - 1
67
+
68
+ next: ()->
69
+ return if @atLast()
70
+ @activate( @activeCard + 1)
71
+
72
+ previous: ()->
73
+ return if @atFirst()
74
+ @activate( @activeCard - 1)
75
+
42
76
  cycle: ()->
43
- nextIndex = if @activeCard < @components.length - 1 then @activeCard + 1 else 0
77
+ nextIndex = if @atLast() then 0 else @activeCard + 1
44
78
  @activate( nextIndex )
45
79
 
46
- find: (name)->
47
- @findComponentByName(name,true)
80
+ find: (name)-> Luca(name)
48
81
 
49
82
  firstActivation: ()->
50
83
  @activeComponent().trigger "first:activation", @, @activeComponent()