luca 0.9.6 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +37 -14
- data/lib/luca/rails/version.rb +1 -1
- data/spec/components/collection_view_spec.coffee +24 -2
- data/spec/components/pagination_control_spec.coffee +0 -0
- data/spec/concerns/dom_helpers_spec.coffee +16 -0
- data/spec/concerns/filterable_spec.coffee +25 -0
- data/spec/concerns/model_presenter_spec.coffee +31 -0
- data/spec/concerns/paginatable_spec.coffee +0 -0
- data/spec/concerns/state_model_spec.coffee +0 -0
- data/spec/concerns_spec.coffee +88 -0
- data/spec/core/container_spec.coffee +74 -12
- data/spec/core/model_spec.coffee +6 -1
- data/spec/define_spec.coffee +0 -6
- data/spec/util_spec.coffee +24 -0
- data/src/components/application.coffee +32 -30
- data/src/components/base_toolbar.coffee +6 -4
- data/src/components/collection_loader_view.coffee +3 -1
- data/src/components/collection_view.coffee +42 -21
- data/src/components/controller.coffee +3 -1
- data/src/components/fields/button_field.coffee +19 -12
- data/src/components/fields/checkbox_array.coffee +8 -2
- data/src/components/fields/checkbox_field.coffee +18 -9
- data/src/components/fields/file_upload_field.coffee +5 -1
- data/src/components/fields/hidden_field.coffee +3 -1
- data/src/components/fields/label_field.coffee +4 -3
- data/src/components/fields/select_field.coffee +7 -8
- data/src/components/fields/text_field.coffee +3 -1
- data/src/components/fields/type_ahead_field.coffee +4 -2
- data/src/components/form_button_toolbar.coffee +4 -1
- data/src/components/form_view.coffee +49 -44
- data/src/components/grid_view.coffee +1 -1
- data/src/components/multi_collection_view.coffee +49 -22
- data/src/components/pagination_control.coffee +17 -13
- data/src/{modules → concerns}/application_event_bindings.coffee +1 -1
- data/src/{modules → concerns}/collection_event_bindings.coffee +1 -1
- data/src/{modules → concerns}/deferrable.coffee +1 -1
- data/src/{modules → concerns}/dom_helpers.coffee +11 -2
- data/src/{modules → concerns}/enhanced_properties.coffee +1 -1
- data/src/concerns/filterable.coffee +82 -0
- data/src/{modules → concerns}/grid_layout.coffee +1 -1
- data/src/{modules → concerns}/loadmaskable.coffee +1 -1
- data/src/{modules → concerns}/local_storage.coffee +0 -0
- data/src/{modules → concerns}/modal_view.coffee +1 -1
- data/src/concerns/model_presenter.coffee +23 -0
- data/src/concerns/paginatable.coffee +87 -0
- data/src/{modules → concerns}/state_model.coffee +1 -1
- data/src/{modules → concerns}/templating.coffee +1 -1
- data/src/concerns.coffee +70 -0
- data/src/containers/tab_view.coffee +7 -10
- data/src/core/collection.coffee +17 -1
- data/src/core/container.coffee +56 -31
- data/src/core/field.coffee +39 -38
- data/src/core/meta_data.coffee +37 -0
- data/src/core/model.coffee +18 -1
- data/src/core/view.coffee +25 -29
- data/src/define.coffee +54 -66
- data/src/framework.coffee +23 -18
- data/src/index.coffee +3 -1
- data/src/stylesheets/components/checkbox_array.scss +1 -1
- data/src/stylesheets/components/form_view.scss +5 -5
- data/src/stylesheets/components/viewport.scss +2 -1
- data/src/stylesheets/containers/container.scss +0 -5
- data/src/stylesheets/containers/tab_view.scss +5 -5
- data/src/tools/console.coffee +5 -5
- data/src/util.coffee +47 -0
- data/vendor/assets/javascripts/luca-ui-development-tools.js +5 -5
- data/vendor/assets/javascripts/luca-ui-development-tools.min.js +1 -1
- data/vendor/assets/javascripts/luca-ui-full.js +905 -416
- data/vendor/assets/javascripts/luca-ui-full.min.js +5 -5
- data/vendor/assets/javascripts/luca-ui.js +905 -416
- data/vendor/assets/javascripts/luca-ui.min.js +5 -4
- data/vendor/assets/stylesheets/luca-ui.css +15 -15
- metadata +27 -17
- data/spec/mixin_spec.coffee +0 -49
- data/src/modules/filterable.coffee +0 -60
- data/src/modules/paginatable.coffee +0 -79
data/CHANGELOG
CHANGED
@@ -85,26 +85,26 @@
|
|
85
85
|
0.9.1
|
86
86
|
- Bugfix Release
|
87
87
|
|
88
|
-
0.9.2
|
88
|
+
0.9.2
|
89
89
|
- FormView has errorMessage, successMessage methods which use twitter bootstrap alerts as flash message
|
90
90
|
- FormView toolbar accepts new options: true, both, bottom, or top
|
91
91
|
- Luca.Collection has a property @remoteFiltering which makes applyFilter always use remote fetch
|
92
92
|
- Bugfix in GridView collection change handler
|
93
93
|
- Added Luca.isViewPrototype, Luca.isModelPrototype, Luca.isCollectionPrototype helpers
|
94
94
|
- Added configuration option to control auto registration of components with the registry
|
95
|
-
- Added Luca.parentClass and Luca.inheritanceChain methods for inspecting a component or prototype
|
95
|
+
- Added Luca.parentClass and Luca.inheritanceChain methods for inspecting a component or prototype
|
96
96
|
- Changed single instance tracking mechanism on CollectionManager. Will throw an error if more than one
|
97
97
|
is created without specifying a name.
|
98
98
|
- Added Luca.getCollectionManager() helper as an Alias for Luca.CollectionManager.get()
|
99
99
|
- Luca.getApplication() and Luca.getCollectionManager() accept a name argument
|
100
100
|
- Classes like Luca.Application and Luca.CollectionManager which normally are singletons
|
101
|
-
can have more than one instance if a unique name is given
|
101
|
+
can have more than one instance if a unique name is given
|
102
102
|
|
103
103
|
0.9.3
|
104
104
|
- CardViews and Controllers set data attributes on their elements for the active card / page
|
105
105
|
- Added convenience methods to container 'pluck', 'invoke'
|
106
106
|
- Added methods to Controller for ease of autogenerating routes
|
107
|
-
- Added beforeInitialize hook on Luca.View
|
107
|
+
- Added beforeInitialize hook on Luca.View
|
108
108
|
- Luca.View can now automatically configure state machine models by passing `stateful:true`
|
109
109
|
in your view definition.
|
110
110
|
- Containers will respond to getter attributes set on their components, by defining a getter
|
@@ -118,9 +118,9 @@
|
|
118
118
|
- adding a Luca.PageController component as an alias for Controller
|
119
119
|
|
120
120
|
0.9.33
|
121
|
-
- added gridSpan property to Luca.View. This will automatically add the span class for you to snap your view to the grid.
|
121
|
+
- added gridSpan property to Luca.View. This will automatically add the span class for you to snap your view to the grid.
|
122
122
|
Accepts a number 0-12.
|
123
|
-
- fixed a bug in CardView.componentElements method with bodyClassName being present
|
123
|
+
- fixed a bug in CardView.componentElements method with bodyClassName being present
|
124
124
|
- Added LabelView component. A form field which just displays a value.
|
125
125
|
|
126
126
|
0.9.35
|
@@ -134,14 +134,14 @@
|
|
134
134
|
|
135
135
|
0.9.4
|
136
136
|
- Luca::Template can now configure its namespace, removing duplicate sprockets class
|
137
|
-
- Luca.Application triggers page:change and sub:page:change events
|
137
|
+
- Luca.Application triggers page:change and sub:page:change events
|
138
138
|
- Luca.Viewport gets enable / disable method for fluid and fullscreen mode
|
139
139
|
- Add configurability to fullscreen behavior on viewport
|
140
140
|
|
141
141
|
0.9.41
|
142
142
|
- Changed asset pipeline payload so that luca-ui uses the index convention
|
143
143
|
|
144
|
-
0.9.42
|
144
|
+
0.9.42
|
145
145
|
- Added TableView component, which inherits from Luca.components.CollectionView
|
146
146
|
- Expose ways of customizing Luca.View internals.
|
147
147
|
- Added support for @template property on Luca.View. Behaves the same as @bodyTemplate
|
@@ -151,7 +151,7 @@
|
|
151
151
|
- View mixins use _initializer methods
|
152
152
|
- FilterableView mixin for CollectionView classes
|
153
153
|
- Added Rails Generator for Luca.Application skeleton. ( thanks @nick-desteffen )
|
154
|
-
- Adds ability to pass a function reference as a component. The container will call the function, in
|
154
|
+
- Adds ability to pass a function reference as a component. The container will call the function, in
|
155
155
|
the context of the container, and use the returned object as the component definition template
|
156
156
|
- Adds a defaults property to containers. This will apply the values as defaults to each component.
|
157
157
|
- Adds Luca.EventsExt an optional core extension which provides additional event binding sugar
|
@@ -160,20 +160,43 @@
|
|
160
160
|
- bugfixes in CardView
|
161
161
|
|
162
162
|
0.9.5
|
163
|
-
- Luca.Model gets a 'read' method which will a getter function,
|
163
|
+
- Luca.Model gets a 'read' method which will a getter function,
|
164
164
|
or get an attribute for the given property you are trying to 'read'
|
165
165
|
- CollectionView is modifiable through several mixins:
|
166
166
|
- Filterable
|
167
167
|
- Paginatable
|
168
168
|
- Loadmaskable
|
169
|
-
- Introduces component definition helpers: extends,
|
170
|
-
behavesAs, triggers, defaultsTo which allow for a more
|
169
|
+
- Introduces component definition helpers: extends,
|
170
|
+
behavesAs, triggers, defaultsTo which allow for a more
|
171
171
|
"literate" component definiton style
|
172
172
|
- View helpers moved into mixins:
|
173
173
|
- StateModel
|
174
174
|
- EnhancedProperties
|
175
175
|
- CollectionEventBindings
|
176
|
-
- ApplicationEventBindings
|
176
|
+
- ApplicationEventBindings
|
177
177
|
- Changed syntax for @componentEvents configuration on Luca.core.Container.
|
178
|
-
- now accepts role, name, or getter method
|
178
|
+
- now accepts role, name, or getter method
|
179
179
|
- now accepts * for component, to bind to the same event on all components
|
180
|
+
|
181
|
+
0.9.65
|
182
|
+
- Luca.core.Container components can now be configured with a @container property
|
183
|
+
which accepts any valid CSS selector so long as it is scoped within that container view's @$el.
|
184
|
+
Previously required an element with a specific ID which made it harder to build extendable components
|
185
|
+
with specific render targets
|
186
|
+
|
187
|
+
0.9.66
|
188
|
+
- Luca.core.Container components can now be extended by subclasses by specifying an @extensions property.
|
189
|
+
@extensions work by applying the hash to the component in the same index'd position as that component
|
190
|
+
configuration in the superclass.
|
191
|
+
- Luca.components.CollectionView now has a @loadModels() method which resets the collection with the passed models.
|
192
|
+
- Added @componentMetaData() method which is going to replace the trickery done behind the scenes in Luca.extend
|
193
|
+
- Luca.config.autoApplyCssClassHierarchy if set to true, will add css class names to your luca components to make inheritance based styling easier.
|
194
|
+
|
195
|
+
0.9.7
|
196
|
+
- Introduced publicInterface, publicConfiguration, privateInterface, and privateConfiguration as component registry methods.
|
197
|
+
These methods are intended to offer finer grain control over the component definition process for the purposes of building
|
198
|
+
our auto-generated documentation tool.
|
199
|
+
- Added Luca.concern support on Collection and Model
|
200
|
+
- Renaming 'mixin' and 'module' functionality to 'concern'
|
201
|
+
- Luca.concerns now follow the active support concern in spirit, with __included hooks, ClassMethods handling, etc
|
202
|
+
- Introducing an optional Concern for Luca.Model classes, called ModelPresenter.
|
data/lib/luca/rails/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
describe 'The Collection View', ->
|
2
2
|
beforeEach ->
|
3
3
|
@collection = new Luca.Collection([
|
4
|
-
id: 1, attr: "value_one"
|
4
|
+
id: 1, attr: "value_one", filter: "value"
|
5
5
|
,
|
6
|
-
id: 2, attr: "value_two"
|
6
|
+
id: 2, attr: "value_two", filter: "value"
|
7
7
|
],
|
8
8
|
model: Luca.Model)
|
9
9
|
|
@@ -12,9 +12,31 @@ describe 'The Collection View', ->
|
|
12
12
|
itemClassName: "custom-class"
|
13
13
|
itemProperty: 'attr'
|
14
14
|
collection: @collection
|
15
|
+
filterable:
|
16
|
+
query:
|
17
|
+
filter: "value"
|
18
|
+
options:
|
19
|
+
sortBy: "filter"
|
15
20
|
|
16
21
|
@view.render()
|
17
22
|
|
23
|
+
it "should provide access to the query", ->
|
24
|
+
expect( @view.getQuery() ).toBeDefined()
|
25
|
+
|
26
|
+
it "should provide access to the query options", ->
|
27
|
+
expect( @view.getQueryOptions() ).toBeDefined()
|
28
|
+
|
29
|
+
it "should combine filter and pagination in the options hash", ->
|
30
|
+
@view.setPage(5)
|
31
|
+
@view.applyFilter({filter:"value"},{sortBy:'filter'})
|
32
|
+
|
33
|
+
options = @view.getQueryOptions()
|
34
|
+
query = @view.getQuery()
|
35
|
+
|
36
|
+
expect( options.page ).toEqual 5
|
37
|
+
expect( options.sortBy ).toEqual 'filter'
|
38
|
+
expect( query.filter ).toEqual 'value'
|
39
|
+
|
18
40
|
it "should render the attributes in the specified list elements", ->
|
19
41
|
expect( @view.$html() ).toContain('value_one')
|
20
42
|
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
describe 'The DOM Helpers module', ->
|
2
|
+
describe "The Wrapping Helper", ->
|
3
|
+
it "should accept a space delimited list", ->
|
4
|
+
v = new Luca.View(wrapperClass: "class-one class-two")
|
5
|
+
expect( v.$el.parent().is(".class-one.class-two") ).toEqual(true)
|
6
|
+
|
7
|
+
describe "Auto Assigning Class Names", ->
|
8
|
+
it "should apply the class of the component all the way up its hierarchy", ->
|
9
|
+
c = new Luca.core.Container()
|
10
|
+
expect( c.$el.is(".luca-container") ).toBeTruthy()
|
11
|
+
expect( c.$el.is(".luca-panel") ).toBeTruthy()
|
12
|
+
|
13
|
+
it "should leave out backbone and luca view classes", ->
|
14
|
+
c = new Luca.core.Container()
|
15
|
+
expect( c.$el.is(".luca-view") ).not.toBeTruthy()
|
16
|
+
expect( c.$el.is(".backbone-view") ).not.toBeTruthy()
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe 'The Filterable Plugin', ->
|
2
|
+
describe 'Through the CollectionView', ->
|
3
|
+
beforeEach ->
|
4
|
+
@collection = new Luca.Collection [{name:"name"},{name:"filterable"}]
|
5
|
+
|
6
|
+
@view = new Luca.components.TableView
|
7
|
+
collection:@collection
|
8
|
+
columns:[reader:"name"]
|
9
|
+
|
10
|
+
it 'should generate a Backbone.QueryCollection query payload', ->
|
11
|
+
expect( @view.getFilterState().toQuery() ).toBeDefined()
|
12
|
+
|
13
|
+
it "should have a toRemote method which merges params", ->
|
14
|
+
expect( @view.getFilterState().toRemote() ).toBeDefined()
|
15
|
+
|
16
|
+
it 'should apply filter values', ->
|
17
|
+
@view.applyFilter(filter:"value")
|
18
|
+
expect( @view.getFilterState().toQuery().filter ).toEqual('value')
|
19
|
+
|
20
|
+
it 'should generate a Backbone.QueryCollection options payload', ->
|
21
|
+
expect( @view.getFilterState().toOptions() ).toBeDefined()
|
22
|
+
|
23
|
+
it "should trigger a refresh event on filter change", ->
|
24
|
+
@view.applyFilter(filter:"value")
|
25
|
+
expect( @view ).toHaveTriggered("refresh")
|
@@ -0,0 +1,31 @@
|
|
1
|
+
describe 'The Presenter Mixin', ->
|
2
|
+
presenterModel = Luca.register("Luca.models.PresenterModel").extends("Luca.Model")
|
3
|
+
presenterModel.mixesIn("ModelPresenter")
|
4
|
+
presenterModel.defines
|
5
|
+
randomProperty: "chocolate"
|
6
|
+
fullName: ()->
|
7
|
+
@get("first_name") + ' ' + @get("last_name")
|
8
|
+
defaults:
|
9
|
+
first_name: "Jonathan"
|
10
|
+
last_name: "Soeder"
|
11
|
+
|
12
|
+
it "should respond to presentAs", ->
|
13
|
+
expect( Luca.models.PresenterModel::presentAs ).toBeDefined()
|
14
|
+
|
15
|
+
it "should define the presenter class methods on the model class", ->
|
16
|
+
expect( Luca.models.PresenterModel.registerPresenter ).toBeDefined()
|
17
|
+
|
18
|
+
it "should define the presenter class methods on the model class", ->
|
19
|
+
expect( Luca.models.PresenterModel.getPresenter ).toBeDefined()
|
20
|
+
|
21
|
+
it "should register a presenter format", ->
|
22
|
+
Luca.models.PresenterModel.registerPresenter "names", ["first_name", "last_name", "fullName"]
|
23
|
+
expect( Luca.models.PresenterModel.getPresenter("names") ).toBeDefined()
|
24
|
+
|
25
|
+
it "should present a model in the desired format", ->
|
26
|
+
model = new Luca.models.PresenterModel()
|
27
|
+
presented = model.presentAs('names')
|
28
|
+
expect( _.isObject(presented) ).toEqual true
|
29
|
+
expect( presented ).toBeDefined()
|
30
|
+
expect( _( presented ).keys()... ).toEqual "first_name", "last_name", "fullName"
|
31
|
+
expect( presented.fullName ).toEqual 'Jonathan Soeder'
|
File without changes
|
File without changes
|
@@ -0,0 +1,88 @@
|
|
1
|
+
describe 'The Concern System', ->
|
2
|
+
|
3
|
+
window.Luca ||= {}
|
4
|
+
|
5
|
+
Luca.concern.namespace 'Luca.test_concerns'
|
6
|
+
|
7
|
+
Luca.test_concerns =
|
8
|
+
CollectionMixin:
|
9
|
+
__initializer: ()->
|
10
|
+
@trigger "collection:mixin"
|
11
|
+
SecondMixin:
|
12
|
+
__included: ()->
|
13
|
+
window.secondMixinIncluded = true
|
14
|
+
__initializer: ()->
|
15
|
+
@trigger "second:mixin"
|
16
|
+
FirstMixin:
|
17
|
+
__initializer: ()->
|
18
|
+
@trigger "first:mixin"
|
19
|
+
__privateMethod: ()->
|
20
|
+
true
|
21
|
+
publicMethod: ()->
|
22
|
+
true
|
23
|
+
|
24
|
+
sampleView = Luca.register('Luca.components.FirstView')
|
25
|
+
|
26
|
+
sampleView.mixesIn 'FirstMixin'
|
27
|
+
|
28
|
+
sampleView.defines
|
29
|
+
sampleMethod: ()->
|
30
|
+
"sample"
|
31
|
+
|
32
|
+
secondView = Luca.register("Luca.components.SecondView")
|
33
|
+
secondView.extends 'Luca.components.FirstView'
|
34
|
+
secondView.mixesIn 'SecondMixin'
|
35
|
+
secondView.defines
|
36
|
+
version: 2
|
37
|
+
|
38
|
+
collection = Luca.register("Luca.components.MixinCollection")
|
39
|
+
collection.mixesIn "CollectionMixin"
|
40
|
+
collection.defines version: 2
|
41
|
+
|
42
|
+
model = Luca.register("Luca.components.MixinModel")
|
43
|
+
model.mixesIn "CollectionMixin"
|
44
|
+
model.defines version: 2
|
45
|
+
|
46
|
+
it "should work on models", ->
|
47
|
+
model = new Luca.components.MixinModel()
|
48
|
+
expect( model ).toHaveTriggered("collection:mixin")
|
49
|
+
|
50
|
+
it "should work on collections", ->
|
51
|
+
collection = new Luca.components.MixinCollection()
|
52
|
+
expect( collection ).toHaveTriggered("collection:mixin")
|
53
|
+
|
54
|
+
it "should work on views", ->
|
55
|
+
secondView = new Luca.components.SecondView
|
56
|
+
expect( secondView ).toHaveTriggered("second:mixin")
|
57
|
+
|
58
|
+
it "should omit methods prefixed with the double underscore", ->
|
59
|
+
sampleView = new Luca.components.FirstView
|
60
|
+
expect( sampleView.__privateMethod ).not.toBeDefined()
|
61
|
+
|
62
|
+
|
63
|
+
it "should extend the prototype with the concern definition", ->
|
64
|
+
sampleView = new Luca.components.FirstView
|
65
|
+
expect( sampleView.publicMethod ).toBeDefined()
|
66
|
+
|
67
|
+
it "should call the initializers up the prototype chain", ->
|
68
|
+
secondView = new Luca.components.SecondView
|
69
|
+
expect( secondView ).toHaveTriggered("first:mixin")
|
70
|
+
expect( secondView ).toHaveTriggered("second:mixin")
|
71
|
+
|
72
|
+
describe "Class Methods on the concern", ->
|
73
|
+
Luca.test_concerns.ExampleConcern =
|
74
|
+
instanceMethod: ()-> "instanceMethod"
|
75
|
+
classMethods:
|
76
|
+
classMethod: ()-> "classMethod"
|
77
|
+
|
78
|
+
v = Luca.register("Luca.components.ClassMethodView").mixesIn("ExampleConcern")
|
79
|
+
|
80
|
+
v.defines(version:1)
|
81
|
+
|
82
|
+
it "should distinguish between instance methods and class methods", ->
|
83
|
+
value = Luca.components.ClassMethodView::instanceMethod.call(@)
|
84
|
+
expect( value ).toEqual 'instanceMethod'
|
85
|
+
|
86
|
+
it "should distinguish between instance methods and class methods", ->
|
87
|
+
value = Luca.components.ClassMethodView.classMethod.call(@)
|
88
|
+
expect( value ).toEqual 'classMethod'
|
@@ -3,6 +3,13 @@ describe 'The Luca Container', ->
|
|
3
3
|
c = @container = new Luca.core.Container
|
4
4
|
defaults:
|
5
5
|
defaultProperty: 'it_works'
|
6
|
+
extensions:[
|
7
|
+
extension: 1
|
8
|
+
,
|
9
|
+
extension: 2
|
10
|
+
,
|
11
|
+
extension: 3
|
12
|
+
]
|
6
13
|
components:[
|
7
14
|
name: "component_one"
|
8
15
|
ctype: "view"
|
@@ -47,6 +54,10 @@ describe 'The Luca Container', ->
|
|
47
54
|
it "should create a getter function on the container", ->
|
48
55
|
expect( @container.getOne().name ).toEqual 'component_one'
|
49
56
|
|
57
|
+
it "should apply extensions to the components", ->
|
58
|
+
expect( @container.getRoleOne().extension ).toEqual 1
|
59
|
+
expect( @container.getRoleTwo().extension ).toEqual 2
|
60
|
+
|
50
61
|
it "should apply default properties to components", ->
|
51
62
|
defaults = @container.selectByAttribute('defaultProperty','it_works')
|
52
63
|
custom = @container.selectByAttribute('defaultProperty','oh_yeah')
|
@@ -85,31 +96,70 @@ describe 'The Luca Container', ->
|
|
85
96
|
@container.eachComponent (c)-> c.spy()
|
86
97
|
expect( Luca.cache("component_four").spy ).toHaveBeenCalled()
|
87
98
|
|
99
|
+
describe 'Component Inheritance and Customization', ->
|
100
|
+
it "should accept an array for extensions configuration and join on position/index", ->
|
101
|
+
container = new Luca.core.Container
|
102
|
+
extensions:[
|
103
|
+
undefined
|
104
|
+
,
|
105
|
+
name: "custom_two"
|
106
|
+
]
|
107
|
+
components:[
|
108
|
+
role: "component_one"
|
109
|
+
name: "component_one"
|
110
|
+
,
|
111
|
+
role: "component_two"
|
112
|
+
name: "component_two"
|
113
|
+
]
|
114
|
+
|
115
|
+
container.render()
|
116
|
+
|
117
|
+
expect( container.getComponentTwo().name ).toEqual "custom_two"
|
118
|
+
|
119
|
+
it "should accept an object for extensions configuration and join using role", ->
|
120
|
+
container = new Luca.core.Container
|
121
|
+
extensions:
|
122
|
+
component_one:
|
123
|
+
name: "custom_one"
|
124
|
+
components:[
|
125
|
+
role: "component_one"
|
126
|
+
name: "component_one"
|
127
|
+
,
|
128
|
+
role: "component_two"
|
129
|
+
name: "component_two"
|
130
|
+
]
|
131
|
+
|
132
|
+
container.render()
|
133
|
+
|
134
|
+
expect( container.getComponentOne().name ).toEqual "custom_one"
|
88
135
|
|
89
136
|
describe 'Component Event Binding', ->
|
90
137
|
beforeEach ->
|
91
138
|
@container = new Luca.core.Container
|
92
139
|
componentEvents:
|
93
|
-
"
|
140
|
+
"haha trigger:one" : "one"
|
94
141
|
"alpha trigger:two" : "two"
|
95
142
|
"getAlphaComponent trigger:three" : "three"
|
96
143
|
"* trigger:four" : "four"
|
97
144
|
"beta trigger:five" : "five"
|
98
145
|
|
99
146
|
one: ()->
|
100
|
-
@trigger "one"
|
147
|
+
@trigger "one"
|
101
148
|
|
102
149
|
two: ()->
|
103
|
-
@trigger "two"
|
150
|
+
@trigger "two"
|
104
151
|
|
105
152
|
three: ()->
|
106
|
-
@trigger "three"
|
153
|
+
@trigger "three"
|
107
154
|
|
108
155
|
four: ()->
|
109
|
-
@trigger "four"
|
156
|
+
@trigger "four"
|
110
157
|
|
111
158
|
five: ()->
|
112
|
-
@trigger "five"
|
159
|
+
@trigger "five"
|
160
|
+
|
161
|
+
afterRender: ()->
|
162
|
+
@getGamma().trigger("after:render:gamma")
|
113
163
|
|
114
164
|
registerComponentEvents: ()->
|
115
165
|
Luca.core.Container::registerComponentEvents.apply(@, arguments)
|
@@ -124,6 +174,10 @@ describe 'Component Event Binding', ->
|
|
124
174
|
components:[
|
125
175
|
name: "beta_view"
|
126
176
|
role: "beta"
|
177
|
+
components:[
|
178
|
+
role: "gamma"
|
179
|
+
name: "haha"
|
180
|
+
]
|
127
181
|
]
|
128
182
|
]
|
129
183
|
|
@@ -131,27 +185,35 @@ describe 'Component Event Binding', ->
|
|
131
185
|
|
132
186
|
it "should give me all of the components", ->
|
133
187
|
names = _( @container.allChildren() ).pluck('name')
|
134
|
-
expect( names ).toEqual ['component_alpha','container_tester','beta_view']
|
188
|
+
expect( names ).toEqual ['component_alpha','container_tester','beta_view','haha']
|
135
189
|
|
136
190
|
it "should drill down into nested components", ->
|
137
191
|
expect( @container.getBeta ).toBeDefined()
|
138
192
|
expect( @container.getBeta().name ).toEqual 'beta_view'
|
139
193
|
|
194
|
+
it "should observe the right rendering order", ->
|
195
|
+
expect( @container.getGamma() ).toHaveTriggered("after:render:gamma")
|
196
|
+
|
140
197
|
it "should pick up events on nested components", ->
|
141
198
|
@container.getBeta().trigger("trigger:five")
|
142
199
|
expect( @container ).toHaveTriggered("five")
|
143
200
|
|
144
|
-
it "should define
|
201
|
+
it "should recursively define role based getters", ->
|
145
202
|
expect( @container.getAlpha ).toBeDefined()
|
203
|
+
expect( @container.getBeta ).toBeDefined()
|
204
|
+
expect( @container.getGamma ).toBeDefined()
|
146
205
|
|
147
206
|
it "should define a getter", ->
|
148
207
|
expect( @container.getAlphaComponent ).toBeDefined()
|
149
208
|
|
150
|
-
it "should find
|
151
|
-
expect( @container.
|
209
|
+
it "should find a nested component by name", ->
|
210
|
+
expect( @container.findComponentByName('haha') ).toBeDefined()
|
152
211
|
|
153
212
|
it "should find the component by its name", ->
|
154
|
-
expect( @container.findComponentByName(
|
213
|
+
expect( @container.findComponentByName("beta_view") ).toBeDefined()
|
214
|
+
|
215
|
+
it "should find the component by its role", ->
|
216
|
+
expect( @container.findComponentByRole("alpha") ).toBeDefined()
|
155
217
|
|
156
218
|
it "should find the component by its getter", ->
|
157
219
|
expect( @container.findComponentByGetter('getAlphaComponent') ).toBeDefined()
|
@@ -161,7 +223,7 @@ describe 'Component Event Binding', ->
|
|
161
223
|
expect( @container ).toHaveTriggered("four")
|
162
224
|
|
163
225
|
it "should accept component events with a component name", ->
|
164
|
-
@container.
|
226
|
+
@container.getGamma().trigger "trigger:one"
|
165
227
|
expect(@container).toHaveTriggered("one")
|
166
228
|
|
167
229
|
it "should accept component events with a component role", ->
|
data/spec/core/model_spec.coffee
CHANGED
@@ -50,13 +50,14 @@ describe "Luca.Model with computed attribute", ->
|
|
50
50
|
expect(model.get("fullName")).toEqual('Nickolay Schwarz')
|
51
51
|
|
52
52
|
|
53
|
-
describe 'The Read Method', ->
|
54
53
|
|
54
|
+
describe 'The Read Method', ->
|
55
55
|
ModelClass = Luca.Model.extend
|
56
56
|
defaults:
|
57
57
|
attribute: "attribute"
|
58
58
|
reader: ()->
|
59
59
|
"reader"
|
60
|
+
property: true
|
60
61
|
|
61
62
|
it "should read an attribute", ->
|
62
63
|
model = new ModelClass()
|
@@ -66,3 +67,7 @@ describe 'The Read Method', ->
|
|
66
67
|
model = new ModelClass()
|
67
68
|
expect( model.read('attribute') ).toEqual "attribute"
|
68
69
|
expect( model.read('reader') ).toEqual 'reader'
|
70
|
+
|
71
|
+
it "should read model object attributes as a fallback", ->
|
72
|
+
model = new ModelClass()
|
73
|
+
expect( model.read('property') ).toEqual true
|
data/spec/define_spec.coffee
CHANGED
@@ -10,10 +10,4 @@ describe 'The Component Definition System', ->
|
|
10
10
|
Luca.register("Luca.components.SampleComponentDefinition").defines(version: 1)
|
11
11
|
expect( Luca.parentClasses(Luca.components.SampleComponentDefinition) ).toContain 'Luca.View'
|
12
12
|
|
13
|
-
it "should track the parent classes", ->
|
14
|
-
Luca.register("Luca.components.SampleComponentDefinition").defines(version: 1)
|
15
|
-
expect( Luca.parentClasses(Luca.components.SampleComponentDefinition) ).toEqual ['Luca.View','Backbone.View']
|
16
|
-
|
17
|
-
xit "should defer component extension until dependencies are defined", ->
|
18
|
-
|
19
13
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
describe 'The Luca Utilities', ->
|
2
|
+
describe "Converting from component class to css class", ->
|
3
|
+
it "should produce a css class from the component class name", ->
|
4
|
+
component = "Luca.core.Container"
|
5
|
+
cssClass = Luca.util.toCssClass(component)
|
6
|
+
expect( cssClass ).toEqual 'luca-core-container'
|
7
|
+
|
8
|
+
it "should produce a css class from the component class name", ->
|
9
|
+
component = "Luca.components.MultiCollectionView"
|
10
|
+
cssClass = Luca.util.toCssClass(component)
|
11
|
+
expect( cssClass ).toEqual 'luca-components-multi-collection-view'
|
12
|
+
|
13
|
+
it "should produce a css class from the component class name", ->
|
14
|
+
component = "Luca.View"
|
15
|
+
cssClass = Luca.util.toCssClass(component)
|
16
|
+
expect( cssClass ).toEqual 'luca-view'
|
17
|
+
|
18
|
+
it "should exclude parts", ->
|
19
|
+
component = "Luca.components.MultiCollectionView"
|
20
|
+
cssClass = Luca.util.toCssClass(component, 'components')
|
21
|
+
expect( cssClass ).toEqual "luca-multi-collection-view"
|
22
|
+
|
23
|
+
|
24
|
+
|