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.
- data/CHANGELOG +41 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.md +5 -0
- data/Rakefile +4 -0
- data/assets/javascripts/dependencies/underscore-min.js +5 -31
- data/assets/javascripts/luca-templates.js +1 -0
- data/assets/javascripts/luca-ui-base.coffee +1 -1
- data/assets/javascripts/luca-ui-development-tools.coffee +1 -1
- data/assets/javascripts/luca-ui-full.js +1 -1
- data/assets/javascripts/luca-ui-spec.coffee +1 -1
- data/assets/javascripts/luca-ui.js +3 -0
- data/assets/javascripts/luca/index.coffee +1 -0
- data/lib/generators/luca/application/application_generator.rb +71 -0
- data/lib/generators/luca/application/templates/controller.rb +6 -0
- data/lib/generators/luca/application/templates/index.html.erb +7 -0
- data/lib/generators/luca/application/templates/index.html.haml +6 -0
- data/lib/generators/luca/application/templates/javascripts/application.js +28 -0
- data/lib/generators/luca/application/templates/javascripts/application.js.coffee +20 -0
- data/lib/generators/luca/application/templates/javascripts/config.js +15 -0
- data/lib/generators/luca/application/templates/javascripts/config.js.coffee +9 -0
- data/lib/generators/luca/application/templates/javascripts/dependencies.js +5 -0
- data/lib/generators/luca/application/templates/javascripts/dependencies.js.coffee +5 -0
- data/lib/generators/luca/application/templates/javascripts/index.js +9 -0
- data/lib/generators/luca/application/templates/javascripts/index.js.coffee +9 -0
- data/lib/generators/luca/application/templates/javascripts/main.js +8 -0
- data/lib/generators/luca/application/templates/javascripts/main.js.coffee +3 -0
- data/lib/generators/luca/application/templates/javascripts/main.jst.ejs +1 -0
- data/lib/generators/luca/application/templates/javascripts/router.js +12 -0
- data/lib/generators/luca/application/templates/javascripts/router.js.coffee +7 -0
- data/lib/luca/rails/version.rb +1 -1
- data/lib/luca/template.rb +1 -1
- data/spec/components/collection_view_spec.coffee +37 -0
- data/spec/components/multi_collection_view_spec.coffee +5 -0
- data/spec/components/table_view_spec.coffee +17 -0
- data/spec/core/container_spec.coffee +112 -5
- data/spec/core/model_spec.coffee +21 -3
- data/spec/define_spec.coffee +19 -0
- data/spec/mixin_spec.coffee +49 -0
- data/src/components/application.coffee +33 -19
- data/src/components/collection_view.coffee +109 -38
- data/src/components/fields/checkbox_field.coffee +2 -2
- data/src/components/fields/file_upload_field.coffee +0 -3
- data/src/components/fields/hidden_field.coffee +0 -3
- data/src/components/fields/label_field.coffee +1 -4
- data/src/components/fields/select_field.coffee +6 -6
- data/src/components/fields/text_area_field.coffee +1 -0
- data/src/components/fields/text_field.coffee +4 -0
- data/src/components/fields/type_ahead_field.coffee +5 -9
- data/src/components/form_view.coffee +2 -0
- data/src/components/index.coffee +1 -0
- data/src/components/multi_collection_view.coffee +94 -0
- data/src/components/pagination_control.coffee +100 -0
- data/src/components/table_view.coffee +62 -0
- data/src/containers/card_view.coffee +44 -11
- data/src/containers/panel_toolbar.coffee +88 -82
- data/src/containers/tab_view.coffee +3 -3
- data/src/containers/viewport.coffee +10 -4
- data/src/core/collection.coffee +11 -4
- data/src/core/container.coffee +189 -113
- data/src/core/field.coffee +13 -10
- data/src/core/model.coffee +23 -27
- data/src/core/registry.coffee +48 -35
- data/src/core/view.coffee +60 -140
- data/src/define.coffee +91 -19
- data/src/framework.coffee +10 -8
- data/src/index.coffee +23 -0
- data/src/managers/collection_manager.coffee +24 -8
- data/src/modules/application_event_bindings.coffee +19 -0
- data/src/modules/collection_event_bindings.coffee +26 -0
- data/src/modules/deferrable.coffee +3 -1
- data/src/modules/dom_helpers.coffee +49 -0
- data/src/modules/enhanced_properties.coffee +23 -0
- data/src/modules/filterable.coffee +60 -0
- data/src/modules/grid_layout.coffee +15 -0
- data/src/modules/{load_mask.coffee → loadmaskable.coffee} +10 -4
- data/src/modules/modal_view.coffee +38 -0
- data/src/modules/paginatable.coffee +79 -0
- data/src/modules/state_model.coffee +16 -0
- data/src/modules/templating.coffee +8 -0
- data/src/plugins/events.coffee +30 -2
- data/src/templates/components/bootstrap_form_controls.jst.ejs +10 -0
- data/src/templates/components/collection_loader_view.jst.ejs +6 -0
- data/src/templates/components/form_alert.jst.ejs +4 -0
- data/src/templates/components/grid_view.jst.ejs +11 -0
- data/src/templates/components/grid_view_empty_text.jst.ejs +3 -0
- data/src/templates/components/load_mask.jst.ejs +5 -0
- data/src/templates/components/nav_bar.jst.ejs +4 -0
- data/src/templates/components/pagination.jst.ejs +10 -0
- data/src/templates/containers/basic.jst.ejs +1 -0
- data/src/templates/containers/tab_selector_container.jst.ejs +12 -0
- data/src/templates/containers/tab_view.jst.ejs +2 -0
- data/src/templates/containers/toolbar_wrapper.jst.ejs +1 -0
- data/src/templates/fields/button_field.jst.ejs +2 -0
- data/src/templates/fields/button_field_link.jst.ejs +6 -0
- data/src/templates/fields/checkbox_array.jst.ejs +4 -0
- data/src/templates/fields/checkbox_array_item.jst.ejs +3 -0
- data/src/templates/fields/checkbox_field.jst.ejs +10 -0
- data/src/templates/fields/file_upload_field.jst.ejs +10 -0
- data/src/templates/fields/hidden_field.jst.ejs +1 -0
- data/src/templates/fields/select_field.jst.ejs +11 -0
- data/src/templates/fields/text_area_field.jst.ejs +11 -0
- data/src/templates/fields/text_field.jst.ejs +16 -0
- data/src/templates/table_view.jst.ejs +4 -0
- data/src/tools/console.coffee +51 -21
- data/src/util.coffee +17 -4
- data/vendor/assets/javascripts/luca-ui-base.js +3288 -613
- data/vendor/assets/javascripts/luca-ui-development-tools.js +49 -21
- data/vendor/assets/javascripts/luca-ui-development-tools.min.js +1 -1
- data/vendor/assets/javascripts/luca-ui-full.js +1704 -554
- data/vendor/assets/javascripts/luca-ui-full.min.js +7 -6
- data/vendor/assets/javascripts/luca-ui-spec.js +1783 -830
- data/vendor/assets/javascripts/luca-ui-templates.js +92 -0
- data/vendor/assets/javascripts/luca-ui.js +1694 -523
- data/vendor/assets/javascripts/luca-ui.min.js +4 -4
- metadata +69 -31
- data/assets/javascripts/luca-ui.coffee +0 -3
- data/src/luca.coffee +0 -22
- data/src/templates/components/bootstrap_form_controls.luca +0 -7
- data/src/templates/components/collection_loader_view.luca +0 -5
- data/src/templates/components/form_alert +0 -0
- data/src/templates/components/form_alert.luca +0 -3
- data/src/templates/components/grid_view.luca +0 -7
- data/src/templates/components/grid_view_empty_text.luca +0 -3
- data/src/templates/components/load_mask.luca +0 -3
- data/src/templates/components/nav_bar.luca +0 -2
- data/src/templates/containers/basic.luca +0 -1
- data/src/templates/containers/tab_selector_container.luca +0 -8
- data/src/templates/containers/tab_view.luca +0 -2
- data/src/templates/containers/toolbar_wrapper.luca +0 -1
- data/src/templates/fields/button_field.luca +0 -2
- data/src/templates/fields/button_field_link.luca +0 -5
- data/src/templates/fields/checkbox_array.luca +0 -4
- data/src/templates/fields/checkbox_array_item.luca +0 -4
- data/src/templates/fields/checkbox_field.luca +0 -9
- data/src/templates/fields/file_upload_field.luca +0 -8
- data/src/templates/fields/hidden_field.luca +0 -1
- data/src/templates/fields/select_field.luca +0 -8
- data/src/templates/fields/text_area_field.luca +0 -8
- data/src/templates/fields/text_field.luca +0 -17
- data/src/templates/sample/contents.luca +0 -1
- data/src/templates/sample/welcome.luca +0 -1
- data/vendor/assets/javascripts/luca-spec-dependencies.js +0 -6135
- 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
|
-
@
|
|
34
|
+
@getInputElement().attr('checked', checked)
|
|
35
35
|
|
|
36
36
|
getValue:()->
|
|
37
|
-
@
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
@input
|
|
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
|
-
@
|
|
80
|
+
@getInputElement().html('')
|
|
80
81
|
|
|
81
82
|
if @includeBlank
|
|
82
|
-
@
|
|
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
|
-
@
|
|
94
|
+
@getInputElement().append( option )
|
|
95
95
|
|
|
96
96
|
@trigger "after:populate:options", @
|
|
97
97
|
@setValue( @currentValue )
|
|
@@ -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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
11
|
+
Luca.fields.TextField::beforeRender.apply(@, arguments)
|
|
12
|
+
@getInputElement().attr('data-provide','typeahead')
|
|
16
13
|
|
|
17
14
|
afterRender: ()->
|
|
18
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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 @
|
|
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()
|