luca 0.9.89 → 0.9.91
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +11 -1
- data/Gemfile +5 -2
- data/Gemfile.lock +84 -56
- data/Rakefile +10 -2
- data/app/assets/javascripts/luca/components/application.coffee +82 -89
- data/app/assets/javascripts/luca/components/collection_view.coffee +9 -5
- data/app/assets/javascripts/luca/components/controller.coffee +72 -11
- data/app/assets/javascripts/luca/components/fields/base.coffee +61 -8
- data/app/assets/javascripts/luca/components/fields/button_field.coffee +53 -7
- data/app/assets/javascripts/luca/components/fields/checkbox_array.coffee +12 -7
- data/app/assets/javascripts/luca/components/fields/text_field.coffee +1 -1
- data/app/assets/javascripts/luca/components/form_view.coffee +2 -2
- data/app/assets/javascripts/luca/components/grid_layout_view.coffee +0 -1
- data/app/assets/javascripts/luca/components/page.coffee +1 -0
- data/app/assets/javascripts/luca/components/table_view.coffee +2 -2
- data/app/assets/javascripts/luca/concerns/dom_helpers.coffee +2 -2
- data/app/assets/javascripts/luca/containers/card_view.coffee +84 -54
- data/app/assets/javascripts/luca/containers/container.coffee +126 -46
- data/app/assets/javascripts/luca/containers/modal_view.coffee +9 -9
- data/app/assets/javascripts/luca/containers/page_controller.coffee +25 -0
- data/app/assets/javascripts/luca/containers/panel_toolbar.coffee +1 -1
- data/app/assets/javascripts/luca/containers/viewport.coffee +2 -5
- data/app/assets/javascripts/luca/core/collection.coffee +18 -4
- data/app/assets/javascripts/luca/core/model.coffee +1 -1
- data/app/assets/javascripts/luca/core/panel.coffee +1 -1
- data/app/assets/javascripts/luca/core/view.coffee +26 -7
- data/app/assets/javascripts/luca/development/code_sync_manager.coffee +51 -4
- data/app/assets/javascripts/luca/development/console.coffee +1 -1
- data/app/assets/javascripts/luca/framework.coffee +1 -1
- data/app/assets/javascripts/luca/index.coffee +1 -0
- data/app/assets/javascripts/luca/util/luca.coffee +2 -1
- data/app/assets/stylesheets/luca/components/viewport.scss +0 -4
- data/bin/luca +14 -0
- data/docs/framework.json +1 -1
- data/docs/luca-framework-documentation.js +1 -0
- data/lib/luca/cli/generate.rb +37 -0
- data/lib/luca/cli/server.rb +20 -0
- data/lib/luca/cli/sync.rb +40 -0
- data/lib/luca/cli/watch.rb +16 -0
- data/lib/luca/cli.rb +68 -0
- data/lib/luca/collection/endpoint.rb +1 -0
- data/lib/luca/component_definition.rb +23 -5
- data/lib/luca/luca_application.rb +18 -7
- data/lib/luca/rails/version.rb +1 -1
- data/lib/luca/server.rb +7 -0
- data/lib/luca/stylesheet.rb +2 -3
- data/lib/luca/version.rb +3 -0
- data/lib/luca/watcher.rb +72 -0
- data/lib/luca.rb +8 -1
- data/luca.gemspec +14 -7
- data/site/.bundle/config +2 -0
- data/site/.gitignore +5 -0
- data/site/.rvmrc +1 -0
- data/site/CHANGELOG.md +41 -0
- data/site/DOCS.md +41 -0
- data/site/Gemfile +8 -0
- data/site/Gemfile.lock +134 -0
- data/site/LICENSE.md +19 -0
- data/site/config.rb +84 -0
- data/site/helpers/site_helpers.rb +20 -0
- data/site/html5bp-docs/README.md +38 -0
- data/site/html5bp-docs/contribute.md +104 -0
- data/site/html5bp-docs/crossdomain.md +21 -0
- data/site/html5bp-docs/css.md +135 -0
- data/site/html5bp-docs/extend.md +507 -0
- data/site/html5bp-docs/faq.md +77 -0
- data/site/html5bp-docs/htaccess.md +323 -0
- data/site/html5bp-docs/html.md +170 -0
- data/site/html5bp-docs/js.md +31 -0
- data/site/html5bp-docs/misc.md +25 -0
- data/site/html5bp-docs/usage.md +109 -0
- data/site/readme.md +47 -0
- data/site/source/.htaccess +540 -0
- data/site/source/404.html +157 -0
- data/site/source/app/assets/javascripts/dependencies.js.coffee +6 -0
- data/site/source/app/assets/javascripts/docs/application.coffee +64 -0
- data/site/source/app/assets/javascripts/docs/collections/docs_documentation.coffee +17 -0
- data/site/source/app/assets/javascripts/docs/collections/github_repositories.coffee +7 -0
- data/site/source/app/assets/javascripts/docs/collections/index.coffee +1 -0
- data/site/source/app/assets/javascripts/docs/collections/luca_documentation.coffee +17 -0
- data/site/source/app/assets/javascripts/docs/collections/public_gists.coffee +4 -0
- data/site/source/app/assets/javascripts/docs/config.coffee +5 -0
- data/site/source/app/assets/javascripts/docs/index.coffee +12 -0
- data/site/source/app/assets/javascripts/docs/lib/router.coffee +3 -0
- data/site/source/app/assets/javascripts/docs/lib/util.coffee +0 -0
- data/site/source/app/assets/javascripts/docs/models/component.coffee +99 -0
- data/site/source/app/assets/javascripts/docs/models/github_repository.coffee +3 -0
- data/site/source/app/assets/javascripts/docs/models/index.coffee +1 -0
- data/site/source/app/assets/javascripts/docs/templates/component_documentation.jst.ejs +55 -0
- data/site/source/app/assets/javascripts/docs/templates/examples_browser/overview.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/examples_browser/selector.jst.ejs +11 -0
- data/site/source/app/assets/javascripts/docs/templates/github_repository.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/layouts/main.jst.ejs +4 -0
- data/site/source/app/assets/javascripts/docs/templates/left_navigation.jst.ejs +5 -0
- data/site/source/app/assets/javascripts/docs/templates/pages/getting_started.jst.ejs +78 -0
- data/site/source/app/assets/javascripts/docs/templates/pages/home.jst.ejs +57 -0
- data/site/source/app/assets/javascripts/docs/views/components/code_editor/index.coffee +0 -0
- data/site/source/app/assets/javascripts/docs/views/components/code_editor.coffee +45 -0
- data/site/source/app/assets/javascripts/docs/views/components/component_documentation.coffee +72 -0
- data/site/source/app/assets/javascripts/docs/views/index.coffee +3 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source/details.coffee +37 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source/list.coffee +31 -0
- data/site/source/app/assets/javascripts/docs/views/pages/browse_source.coffee +46 -0
- data/site/source/app/assets/javascripts/docs/views/pages/component_editor.coffee +10 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/docs.coffee +12 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/source.coffee +13 -0
- data/site/source/app/assets/javascripts/docs/views/pages/examples_browser.coffee +102 -0
- data/site/source/app/assets/javascripts/docs/views/pages/home.coffee +10 -0
- data/site/source/app/assets/javascripts/docs/views/views/api_browser/index.coffee +43 -0
- data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/grid_layout_view_example.coffee +14 -0
- data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/table_view_example.coffee +39 -0
- data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/basic_example.coffee +38 -0
- data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/complex_layout.coffee +110 -0
- data/site/source/app/assets/javascripts/docs/views/views/top_navigation.coffee +6 -0
- data/site/source/app/assets/javascripts/docs-docs.js +1 -0
- data/site/source/app/assets/javascripts/luca-docs.js +1 -0
- data/site/source/app/assets/javascripts/luca-framework-documentation.js +1 -0
- data/site/source/app/assets/javascripts/site.js.coffee +4 -0
- data/site/source/app/assets/javascripts/vendor/codemirror.js +4786 -0
- data/site/source/app/assets/javascripts/vendor/coffeescript.js +346 -0
- data/site/source/app/assets/javascripts/vendor/css.js +465 -0
- data/site/source/app/assets/javascripts/vendor/htmlmixed.js +84 -0
- data/site/source/app/assets/javascripts/vendor/javascript.js +422 -0
- data/site/source/app/assets/javascripts/vendor/js-beautify.js +1353 -0
- data/site/source/app/assets/javascripts/vendor/modernizr-2.6.1.min.js +4 -0
- data/site/source/app/assets/javascripts/vendor/vim.js +2511 -0
- data/site/source/app/assets/stylesheets/docs/api-browser.css.scss +5 -0
- data/site/source/app/assets/stylesheets/docs/application.css.scss +35 -0
- data/site/source/app/assets/stylesheets/docs/browse-source.css.scss +5 -0
- data/site/source/app/assets/stylesheets/docs/scrollable-table.css.scss +5 -0
- data/site/source/app/assets/stylesheets/site.css.scss +2 -0
- data/site/source/app/assets/stylesheets/vendor/codemirror.css +240 -0
- data/site/source/app/assets/stylesheets/vendor/prettify-tomorrow-night-bright.css +160 -0
- data/site/source/app/assets/stylesheets/vendor/twilight.css +26 -0
- data/site/source/crossdomain.xml +15 -0
- data/site/source/documentation.html.haml +1 -0
- data/site/source/favicon_base.png +0 -0
- data/site/source/humans.txt +15 -0
- data/site/source/images/background.png +0 -0
- data/site/source/images/middleman.png +0 -0
- data/site/source/index.html.haml +1 -0
- data/site/source/layouts/layout.haml +55 -0
- data/site/source/readme.md +63 -0
- data/site/source/robots.txt +3 -0
- data/spec/javascripts/components/collection_view_spec.coffee +1 -1
- data/spec/javascripts/containers/card_view_spec.coffee +58 -5
- data/spec/javascripts/core/collection_spec.coffee +1 -1
- data/spec/javascripts/core/view_spec.coffee +2 -2
- data/vendor/assets/javascripts/backbone-min.js +37 -33
- data/vendor/assets/javascripts/backbone-query.min.js +1 -1
- data/vendor/assets/javascripts/jquery.js +5 -4
- data/vendor/assets/javascripts/luca-dependencies.min.js +8 -6
- data/vendor/assets/javascripts/luca-development.min.js +1 -1
- data/vendor/assets/javascripts/luca.full.min.js +12 -10
- data/vendor/assets/javascripts/luca.min.js +5 -5
- data/vendor/assets/javascripts/underscore-min.js +1 -5
- data/vendor/assets/javascripts/underscore-string.min.js +1 -1
- data/vendor/assets/stylesheets/luca-components.css +0 -2
- data/vendor/assets/stylesheets/luca-development.css +1 -1
- metadata +215 -39
- data/app/assets/javascripts/luca/components/page_controller.coffee +0 -3
- data/app/assets/javascripts/luca/core/collection_view.coffee +0 -150
- data/site/assets/bootstrap.min.js +0 -7
- data/site/assets/dependencies.js +0 -94
- data/site/assets/glyphicons-halflings-white.png +0 -0
- data/site/assets/glyphicons-halflings.png +0 -0
- data/site/assets/luca-ui-bootstrap.css +0 -1331
- data/site/assets/luca-ui-bootstrap.js +0 -9
- data/site/assets/luca-ui-development-tools.css +0 -234
- data/site/assets/luca-ui-development-tools.js +0 -18561
- data/site/assets/luca-ui-development-tools.min.js +0 -15
- data/site/assets/luca-ui-full.min.js +0 -8
- data/site/assets/luca-ui.min.js +0 -4
- data/site/assets/sandbox.css +0 -62
- data/site/assets/sandbox.js +0 -469
- data/site/docs/application.html +0 -41
- data/site/docs/caching.html +0 -43
- data/site/docs/collection.html +0 -75
- data/site/docs/collection_manager.html +0 -71
- data/site/docs/containers.html +0 -118
- data/site/docs/events.html +0 -153
- data/site/docs/view.html +0 -128
- data/site/img/glyphicons-halflings-white.png +0 -0
- data/site/img/glyphicons-halflings.png +0 -0
- data/site/index.html +0 -20
- data/site/source-map.js +0 -1
@@ -128,6 +128,10 @@
|
|
128
128
|
# rowFluid: true
|
129
129
|
#
|
130
130
|
# #### Using a layout template with CSS Selectors
|
131
|
+
# If you find yourself needing a container view with a complicated
|
132
|
+
# visual layout, you can provide your own DOM template as a `@bodyTemplate`
|
133
|
+
# and assign each child view in `@components` to its own specific CSS selector.
|
134
|
+
#
|
131
135
|
# ...
|
132
136
|
# container.contains
|
133
137
|
# role: "filter"
|
@@ -153,33 +157,94 @@ container.triggers "before:components",
|
|
153
157
|
container.replaces "Luca.Container"
|
154
158
|
|
155
159
|
container.publicConfiguration
|
160
|
+
# @components should contain a list of object configurations for child view(s)
|
161
|
+
# of this container. The values specified in the configuration object will override the
|
162
|
+
# values defined as properties and methods on your view prototypes.
|
163
|
+
#
|
164
|
+
# There are special properties you can define in your components configuration items
|
165
|
+
# that will effect the container:
|
166
|
+
#
|
167
|
+
# - role: will create a camelized getter for you on the container. e.g. when role is `my_custom_role`,
|
168
|
+
# the container will have a method `getMyCustomRole()` that returns that child view.
|
169
|
+
#
|
170
|
+
# - name: a name for the child view. this allows you to access the component by name using
|
171
|
+
# the find() method on the container.
|
172
|
+
#
|
173
|
+
# - type: a type alias from the component registry. type alias are underscore'd strings
|
174
|
+
# matching the component class name. e.g. App.views.MyCustomView type alias is `my_custom_view`
|
175
|
+
#
|
176
|
+
# - component: a convenience property for setting type, role, and name to be equal.
|
156
177
|
components:[]
|
157
178
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
179
|
+
# The `@defaults` property is an object of configuration parameters which will be set
|
180
|
+
# on each child component. Values explicitly defines in the components config will
|
181
|
+
# take precedence over the default.
|
182
|
+
defaults: {}
|
183
|
+
|
184
|
+
# The `@extensions` property is useful when you are subclassing a container view
|
185
|
+
# which already defines an array of components, and you want to specifically override
|
186
|
+
# properties and settings on the children. The `@extensions` property expects either:
|
187
|
+
#
|
188
|
+
# An object whose keys match the names of the `@role` property defined on the child components.
|
189
|
+
# The value should be an object which will override any values defined on the parent class.
|
190
|
+
#
|
191
|
+
# or:
|
192
|
+
#
|
193
|
+
# An array of objects in the same array position / index as the target child view you wish to extend.
|
194
|
+
extensions: {}
|
165
195
|
|
166
196
|
# @componentEvents provides declarative syntax for responding to events on
|
167
197
|
# the components in this container. the format of the syntax is very similar
|
168
198
|
# to the other event binding helpers:
|
169
199
|
#
|
170
|
-
#
|
171
|
-
#
|
172
|
-
# where component_accessor is either the name of the role, or a method on the container
|
173
|
-
# which will find the component in question.
|
174
|
-
#
|
175
|
-
# myContainer = new Luca.Container
|
176
|
-
# componentEvents:
|
177
|
-
# "name component:trigger" : "handler"
|
178
|
-
# "role component:trigger" : "handler"
|
179
|
-
# "getter component:trigger" : "handler"
|
200
|
+
# `component_accessor component:trigger`
|
180
201
|
#
|
202
|
+
# where component_accessor is either the name of the component, or a the role
|
203
|
+
# property on the component, component:trigger is the event that component fires.
|
204
|
+
# handler is a method on the container which will respond to the child component event.
|
205
|
+
# <pre>
|
206
|
+
# myContainer = new Luca.Container
|
207
|
+
# componentEvents:
|
208
|
+
# "name component:trigger" : "handler"
|
209
|
+
# "role component:trigger" : "handler"
|
210
|
+
# "getter component:trigger" : "handler"
|
211
|
+
# components:[
|
212
|
+
# name: "name"
|
213
|
+
# ]
|
214
|
+
# </pre>
|
181
215
|
componentEvents: {}
|
182
216
|
|
217
|
+
container.privateConfiguration
|
218
|
+
className: 'luca-ui-container'
|
219
|
+
|
220
|
+
# This is a convenience attribute for identifying
|
221
|
+
# views which are luca containers
|
222
|
+
isContainer: true
|
223
|
+
|
224
|
+
# if set to true, we will generate DOM elements
|
225
|
+
# to wrap each of our components in. This should
|
226
|
+
# generally be avoided IMO as it pollutes the DOM,
|
227
|
+
# but is currently necessary for some container implementations
|
228
|
+
generateComponentElements: false
|
229
|
+
|
230
|
+
# if set to true, the DOM elements which wrap
|
231
|
+
# our components will be emptied prior to rendering
|
232
|
+
# the component inside this container.
|
233
|
+
emptyContainerElements: false
|
234
|
+
|
235
|
+
# if @generateComponentElements is true, which tag should this
|
236
|
+
# container wrap our components in?
|
237
|
+
componentTag: 'div'
|
238
|
+
|
239
|
+
# if @generateComponentElements is true, which class should we
|
240
|
+
# apply to the container elements which wrap our components?
|
241
|
+
componentClass: 'luca-ui-panel'
|
242
|
+
|
243
|
+
rendered: false
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
container.privateMethods
|
183
248
|
initialize: (@options={})->
|
184
249
|
_.extend @, @options
|
185
250
|
|
@@ -199,6 +264,7 @@ container.privateConfiguration
|
|
199
264
|
|
200
265
|
Luca.View::initialize.apply @, arguments
|
201
266
|
|
267
|
+
# Removing a container will call remove on all of the nested components as well.
|
202
268
|
remove: ()->
|
203
269
|
Luca.View::remove.apply(@, arguments)
|
204
270
|
@eachComponent (component)->
|
@@ -344,8 +410,7 @@ container.privateConfiguration
|
|
344
410
|
|
345
411
|
map
|
346
412
|
|
347
|
-
# Trigger the Rendering Pipeline process on all of the nested
|
348
|
-
# components
|
413
|
+
# Trigger the Rendering Pipeline process on all of the nested components
|
349
414
|
renderComponents: (@debugMode="")->
|
350
415
|
@debug "container render components"
|
351
416
|
|
@@ -383,8 +448,6 @@ container.privateConfiguration
|
|
383
448
|
|
384
449
|
throw e unless Luca.silenceRenderErrors? is true
|
385
450
|
|
386
|
-
#### Container Activation
|
387
|
-
#
|
388
451
|
# When a container is first activated is a good time to perform
|
389
452
|
# operations which are not needed unless that component becomes
|
390
453
|
# visible. This first activation event should be relayed to all
|
@@ -401,27 +464,6 @@ container.privateConfiguration
|
|
401
464
|
component?.trigger?.call component, "first:activation", component, activator
|
402
465
|
component.previously_activated = true
|
403
466
|
|
404
|
-
#### Underscore Methods For Working with Components
|
405
|
-
_: ()-> _( @components )
|
406
|
-
|
407
|
-
pluck: (attribute)->
|
408
|
-
@_().pluck(attribute)
|
409
|
-
|
410
|
-
invoke: (method)->
|
411
|
-
@_().invoke(method)
|
412
|
-
|
413
|
-
select: (fn)->
|
414
|
-
@_().select(fn)
|
415
|
-
|
416
|
-
detect: (fn)->
|
417
|
-
@_().detect(attribute)
|
418
|
-
|
419
|
-
reject: (fn)->
|
420
|
-
@_().reject(fn)
|
421
|
-
|
422
|
-
map: (fn)->
|
423
|
-
@_().map(fn)
|
424
|
-
|
425
467
|
registerComponentEvents: (eventList, direction="on")->
|
426
468
|
container = @
|
427
469
|
|
@@ -443,13 +485,41 @@ container.privateConfiguration
|
|
443
485
|
|
444
486
|
component[direction](eventId, @[handler], container)
|
445
487
|
|
488
|
+
container.publicMethods
|
489
|
+
# Returns an underscore.js object that wraps the components array
|
490
|
+
_: ()-> _( @components )
|
446
491
|
|
492
|
+
# Return the value of attribute of each component
|
493
|
+
pluck: (attribute)->
|
494
|
+
@_().pluck(attribute)
|
495
|
+
|
496
|
+
# Invoke the passed method name on each component
|
497
|
+
invoke: (method)->
|
498
|
+
@_().invoke(method)
|
499
|
+
|
500
|
+
# Select any component for which the passed iterator returns true
|
501
|
+
select: (iterator)->
|
502
|
+
@_().select(iterator)
|
503
|
+
|
504
|
+
# Find the first matching component for which the passed iterator returns true
|
505
|
+
detect: (iterator)->
|
506
|
+
@_().detect(iterator)
|
507
|
+
|
508
|
+
# Return a list of components without the components for which the passed iterator returns true
|
509
|
+
reject: (iterator)->
|
510
|
+
@_().reject(iterator)
|
511
|
+
|
512
|
+
# Run the passed iterator over each component and return the result in an array
|
513
|
+
map: (fn)->
|
514
|
+
@_().map(fn)
|
515
|
+
|
516
|
+
# Returns a list of nested components which are also containers
|
447
517
|
subContainers: ()->
|
448
518
|
@select (component)->
|
449
519
|
component.isContainer is true
|
450
520
|
|
451
521
|
roles: ()->
|
452
|
-
_( @allChildren() ).pluck('role')
|
522
|
+
_( @allChildren() ).chain().pluck('role').compact().value()
|
453
523
|
|
454
524
|
allChildren: ()->
|
455
525
|
children = @components
|
@@ -459,6 +529,11 @@ container.privateConfiguration
|
|
459
529
|
|
460
530
|
_([children,grandchildren]).chain().compact().flatten().value()
|
461
531
|
|
532
|
+
# Find a direct component on this card by its name.
|
533
|
+
find: (name)->
|
534
|
+
_( @components ).detect (c)->
|
535
|
+
c.name is name
|
536
|
+
|
462
537
|
findComponentForEventBinding: (nameRoleOrGetter, deep=true)->
|
463
538
|
@findComponentByName(nameRoleOrGetter, deep) || @findComponentByGetter( nameRoleOrGetter, deep ) || @findComponentByRole( nameRoleOrGetter, deep )
|
464
539
|
|
@@ -506,10 +581,17 @@ container.privateConfiguration
|
|
506
581
|
fn.call component, component, index
|
507
582
|
component?.eachComponent?.apply component, [fn,deep] if deep
|
508
583
|
|
509
|
-
|
584
|
+
indexOfComponentName: (name)->
|
510
585
|
names = _( @components ).pluck('name')
|
511
586
|
_( names ).indexOf(name)
|
512
587
|
|
588
|
+
indexOf: (nameOrComponent)->
|
589
|
+
if _.isString(nameOrComponent)
|
590
|
+
return @indexOfComponentName(nameOrComponent)
|
591
|
+
|
592
|
+
if _.isObject(nameOrComponent)
|
593
|
+
_( @components ).indexOf( nameOrComponent )
|
594
|
+
|
513
595
|
activeComponent: ()->
|
514
596
|
return @ unless @activeItem
|
515
597
|
return @components[ @activeItem ]
|
@@ -617,8 +699,6 @@ doComponents = ()->
|
|
617
699
|
validateContainerConfiguration = ()->
|
618
700
|
true
|
619
701
|
|
620
|
-
# Private Helpers
|
621
|
-
#
|
622
702
|
# indexComponent( component ).at( index ).in( componentsInternalIndexMap )
|
623
703
|
indexComponent = (component)->
|
624
704
|
at: (index)->
|
@@ -1,13 +1,13 @@
|
|
1
|
-
|
1
|
+
view = Luca.register "Luca.containers.ModalView"
|
2
|
+
view.extends "Luca.Container"
|
2
3
|
|
4
|
+
view.publicConfiguration
|
3
5
|
closeOnEscape: true
|
4
|
-
|
5
6
|
showOnInitialize: false
|
6
|
-
|
7
7
|
backdrop: false
|
8
|
+
className: "modal"
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
view.publicMethods
|
11
11
|
container: ()->
|
12
12
|
$('body')
|
13
13
|
|
@@ -27,10 +27,10 @@ _.def("Luca.ModalView").extends("Luca.Container").with
|
|
27
27
|
$('body').append( @$el )
|
28
28
|
|
29
29
|
@$el.modal
|
30
|
-
backdrop: @backdrop is true
|
31
|
-
keyboard: @closeOnEscape is true
|
32
|
-
show: @showOnInitialize is true
|
30
|
+
backdrop: !!(@backdrop is true)
|
31
|
+
keyboard: !!(@closeOnEscape is true)
|
32
|
+
show: !!(@showOnInitialize is true)
|
33
33
|
|
34
34
|
@
|
35
35
|
|
36
|
-
|
36
|
+
view.register()
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# The PageController container is a special type of container whose components or pages
|
2
|
+
# will always monopolize the entire element's display and where only one page or component
|
3
|
+
# will be visible at a time. The PageController is typically going to be at the very root
|
4
|
+
# of every application, and will be directly integrated with the application's router.
|
5
|
+
# A typical application hierarchy will be an abstract `Viewport` with a single top level
|
6
|
+
# `PageController` named 'main_controller'.
|
7
|
+
#
|
8
|
+
# - Viewport / Application
|
9
|
+
# - Router. ( maps urls to named pages on the controller )
|
10
|
+
# - Main Page Controller
|
11
|
+
# - Pages
|
12
|
+
# - Named views / containers
|
13
|
+
view = Luca.register "Luca.containers.PageController"
|
14
|
+
view.extends "Luca.Container"
|
15
|
+
|
16
|
+
view.privateMethods
|
17
|
+
initialize: (@options={})->
|
18
|
+
@components ||= @pages || @options.pages
|
19
|
+
for component in @components
|
20
|
+
component.components ||= component.pages
|
21
|
+
|
22
|
+
Luca.Container::initialize.apply(@, arguments)
|
23
|
+
|
24
|
+
view.register()
|
25
|
+
|
@@ -39,10 +39,7 @@ viewport.defines
|
|
39
39
|
@$el.removeClass('fullscreen-enabled')
|
40
40
|
|
41
41
|
beforeRender: ()->
|
42
|
-
Luca.
|
43
|
-
|
44
|
-
#if Luca.config.enableBoostrap and @topNav and @fullscreen
|
45
|
-
# $('body').css('padding','40px')
|
42
|
+
Luca.Container::beforeRender?.apply(@, arguments)
|
46
43
|
|
47
44
|
@renderTopNavigation() if @topNav?
|
48
45
|
@renderBottomNavigation() if @bottomNav?
|
@@ -54,7 +51,7 @@ viewport.defines
|
|
54
51
|
@$el.width()
|
55
52
|
|
56
53
|
afterRender: ()->
|
57
|
-
Luca.
|
54
|
+
Luca.Container::afterRender?.apply(@, arguments)
|
58
55
|
|
59
56
|
if Luca.config.enableBoostrap is true and @containerClassName
|
60
57
|
@$el.children().wrap('<div class="#{ containerClassName }" />')
|
@@ -1,4 +1,4 @@
|
|
1
|
-
collection = Luca.
|
1
|
+
collection = Luca.register 'Luca.Collection'
|
2
2
|
collection.extends 'Backbone.QueryCollection'
|
3
3
|
collection.includes 'Luca.Events'
|
4
4
|
|
@@ -6,13 +6,13 @@ collection.triggers "after:initialize",
|
|
6
6
|
"before:fetch",
|
7
7
|
"after:response"
|
8
8
|
|
9
|
-
collection.
|
9
|
+
collection.publicConfiguration
|
10
10
|
model: Luca.Model
|
11
11
|
# cachedMethods refers to a list of methods on the collection
|
12
12
|
# whose value gets cached once it is ran. the collection then
|
13
13
|
# binds to change, add, remove, and reset events and then expires
|
14
14
|
# the cached value once these events are fired.
|
15
|
-
|
15
|
+
#
|
16
16
|
# cachedMethods expects an array of strings representing the method name
|
17
17
|
# or objects containing @method and @resetEvents properties. by default
|
18
18
|
# @resetEvents are 'add','remove',reset' and 'change'.
|
@@ -22,6 +22,17 @@ collection.defines
|
|
22
22
|
# and return the filtered results that way, then set this to true
|
23
23
|
remoteFilter: false
|
24
24
|
|
25
|
+
# setting a cache key to a string, or to a function which returns
|
26
|
+
# a string, will determine where the collections' models are pulled
|
27
|
+
# from if they are available on page load. also known as "bootstrapping"
|
28
|
+
# your collections with data. The cache key will look in whatever object
|
29
|
+
# is set in Luca.config.modelBootstrap for its models.
|
30
|
+
cache_key: undefined
|
31
|
+
|
32
|
+
# Which CollectionManager should we register with? Expects either a string
|
33
|
+
# which will get resolved into a global variable, or a
|
34
|
+
manager: undefined
|
35
|
+
|
25
36
|
initialize: (models=[], @options)->
|
26
37
|
_.extend @, @options
|
27
38
|
@_reset()
|
@@ -44,7 +55,7 @@ collection.defines
|
|
44
55
|
@name ||= @registerAs
|
45
56
|
@manager ||= @registerWith
|
46
57
|
|
47
|
-
@manager =
|
58
|
+
@manager = Luca.util.read(@manager) if @manager?
|
48
59
|
|
49
60
|
# if they specify a
|
50
61
|
if @name and not @manager
|
@@ -346,6 +357,9 @@ collection.defines
|
|
346
357
|
else
|
347
358
|
@models
|
348
359
|
|
360
|
+
collection.register()
|
361
|
+
|
362
|
+
|
349
363
|
# Global Collection Observer
|
350
364
|
_.extend Luca.Collection.prototype,
|
351
365
|
trigger: ()->
|
@@ -136,11 +136,11 @@ view.publicConfiguration
|
|
136
136
|
#
|
137
137
|
autoBindEventHandlers: false
|
138
138
|
|
139
|
-
# Supplying configuration to `@
|
139
|
+
# Supplying configuration to `@_inheritEvents` will ensure that this configuration
|
140
140
|
# is present on views which extend from this view. In normal Backbone behavior
|
141
141
|
# the `@events` property can be overridden by views which extend, and this isn't
|
142
142
|
# always what you want from your component.
|
143
|
-
|
143
|
+
_inheritEvents: undefined
|
144
144
|
|
145
145
|
|
146
146
|
|
@@ -174,14 +174,14 @@ view.publicMethods
|
|
174
174
|
|
175
175
|
Luca.concern.setup.call(@)
|
176
176
|
|
177
|
-
@delegateEvents()
|
177
|
+
@delegateEvents() unless _.isEmpty(@events)
|
178
178
|
|
179
179
|
@trigger "after:initialize", @
|
180
180
|
|
181
181
|
_.bindAll(@, @bindMethods...) if @bindMethods?.legth > 0
|
182
182
|
|
183
|
-
unless _.isEmpty(@
|
184
|
-
for eventId, handler of @
|
183
|
+
unless _.isEmpty(@_inheritEvents)
|
184
|
+
for eventId, handler of @_inheritEvents
|
185
185
|
@registerEvent(eventId, handler)
|
186
186
|
|
187
187
|
|
@@ -198,7 +198,17 @@ view.publicMethods
|
|
198
198
|
|
199
199
|
Backbone.View::trigger.apply @, arguments
|
200
200
|
|
201
|
-
|
201
|
+
# Backbone.View.prototype.make is removed in 0.9.10.
|
202
|
+
# As we happen to rely on this little utility heavily,
|
203
|
+
# we add it to Luca.View
|
204
|
+
make: (tagName, attributes, content)->
|
205
|
+
el = document.createElement(tagName);
|
206
|
+
if (attributes)
|
207
|
+
Backbone.$(el).attr(attributes)
|
208
|
+
if (content != null)
|
209
|
+
Backbone.$(el).html(content)
|
210
|
+
|
211
|
+
el
|
202
212
|
|
203
213
|
registerEvent: (selector, handler)->
|
204
214
|
@events ||= {}
|
@@ -206,7 +216,8 @@ view.publicMethods
|
|
206
216
|
if _.isObject(selector)
|
207
217
|
@events = _.extend(@events, selector)
|
208
218
|
else
|
209
|
-
@
|
219
|
+
if _.isFunction(handler) || (_.isString(handler) && @[handler]?)
|
220
|
+
@events[selector] = handler
|
210
221
|
|
211
222
|
@delegateEvents()
|
212
223
|
|
@@ -240,6 +251,14 @@ view.privateMethods
|
|
240
251
|
# - first:activation : firstActivation()
|
241
252
|
setupHooks: Luca.util.setupHooks
|
242
253
|
|
254
|
+
# In order to support some Luca apps which rely
|
255
|
+
# on Backbone.View.make.
|
256
|
+
view.afterDefinition ()->
|
257
|
+
if not Backbone.View::make?
|
258
|
+
Backbone.View::make = ()->
|
259
|
+
console.log "Backbone.View::make has been removed from backbone. You should use Luca.View::make instead."
|
260
|
+
Luca.View::make
|
261
|
+
|
243
262
|
view.register()
|
244
263
|
|
245
264
|
Luca.View._originalExtend = Backbone.View.extend
|
@@ -1,15 +1,59 @@
|
|
1
|
+
# The `Luca.CodeSyncManager` works along with the Guard adapter that ships with
|
2
|
+
# the ruby gem. This is still an experimental option at this point, but I use
|
3
|
+
# it regularly on all of my Luca projects and it allows me to develop my applications
|
4
|
+
# directly from my editor and rarely have the need to refresth the browser to work with
|
5
|
+
# javascript and css changes.
|
6
|
+
#
|
7
|
+
# #### Similar to LiveReload
|
8
|
+
# It is similar to projects like LiveReload, except that it knows a lot about the luca
|
9
|
+
# framework and application conventions and uses this knowledge to optimize live reloading
|
10
|
+
# behavior, avoiding the need to do full browser reloads. This typically doesn't work well
|
11
|
+
# with state heavy applications, since the browser reloading doesn't always construct application
|
12
|
+
# state exactly as you need it when you're making your css changes etc.
|
13
|
+
#
|
14
|
+
# #### 1) Add an entry to your Guardfile:
|
15
|
+
# guard 'luca' do
|
16
|
+
# watch(%r{^app/assets/stylesheets/(.+)}) do |match|
|
17
|
+
# path = match.last
|
18
|
+
# end
|
19
|
+
|
20
|
+
# watch(%r{^app/assets/javascripts/(.+)}) do |match|
|
21
|
+
# path = match.last
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# #### 2) Add the `CodeSyncManager` to your development mode application.
|
26
|
+
# **Note:** This expect
|
27
|
+
# you to have a `Luca.SocketManager` capable backend such as faye or socket.io running. It
|
28
|
+
# handles the same configuration options as the `Luca.SocketManager` as well.
|
29
|
+
#
|
30
|
+
# app = Luca()
|
31
|
+
# app.codeSyncManager = new Luca.CodeSyncManager
|
32
|
+
# host: "//localhost:9292/faye"
|
33
|
+
# channel: "/changes"
|
34
|
+
# app.codeSyncManager.trigger("ready")
|
35
|
+
#
|
36
|
+
# #### 3) Run guard.
|
37
|
+
# Edit your files, watch your changes appear.
|
38
|
+
#
|
39
|
+
# ### Using the Syncpad
|
40
|
+
#
|
41
|
+
# The syncpad is a special naming convention for development scratch paper in your editor. A file
|
42
|
+
# named syncpad.coffee, syncpad.css.scss, syncpad.jst.ejs.haml, etc will be evaluated live when you change
|
43
|
+
# them in your editor. I personally use this to experiment with code / css and get immediate results without
|
44
|
+
# needing to refresh the browser.
|
1
45
|
codeManager = Luca.register "Luca.CodeSyncManager"
|
2
46
|
codeManager.extends "Luca.SocketManager"
|
3
47
|
|
4
48
|
codeManager.publicConfiguration
|
5
|
-
host: Luca.config.codeSyncHost || "
|
49
|
+
host: Luca.config.codeSyncHost || "//localhost:9292/faye"
|
6
50
|
namespace: "luca"
|
7
|
-
channel: Luca.config.codeSyncChannel || "/
|
51
|
+
channel: Luca.config.codeSyncChannel || "/luca-code-sync"
|
8
52
|
|
9
53
|
codeManager.classMethods
|
10
54
|
setup: (options={})->
|
11
55
|
@codeSyncManager = new Luca.CodeSyncManager(options)
|
12
|
-
@codeSyncManager.trigger
|
56
|
+
@codeSyncManager.trigger "ready"
|
13
57
|
|
14
58
|
codeManager.privateMethods
|
15
59
|
initialize: (@attributes={})->
|
@@ -19,6 +63,9 @@ codeManager.privateMethods
|
|
19
63
|
Luca.SocketManager::initialize.call(@, @attributes)
|
20
64
|
@bindToChannel()
|
21
65
|
|
66
|
+
start: ()->
|
67
|
+
@trigger "ready"
|
68
|
+
|
22
69
|
bindToChannel: ()->
|
23
70
|
if @client?
|
24
71
|
@client.subscribe @channel, ()=>
|
@@ -123,4 +170,4 @@ codeManager.privateMethods
|
|
123
170
|
$('head').append( link )
|
124
171
|
|
125
172
|
codeManager.defines
|
126
|
-
make:
|
173
|
+
make: Luca.View::make
|
@@ -186,7 +186,7 @@ Luca.util.inspectComponent = (component)->
|
|
186
186
|
|
187
187
|
Luca.util.launchers.developmentConsole = (name="luca-development-console")->
|
188
188
|
@_lucaDevConsole = Luca name, ()=>
|
189
|
-
@$el.append
|
189
|
+
@$el.append Luca.View::make("div", id: "#{ name }-wrapper", class: "modal fade large")
|
190
190
|
|
191
191
|
dconsole = new Luca.tools.DevelopmentConsole
|
192
192
|
name: name
|
@@ -112,7 +112,8 @@ Luca.util.loadScript = (url, callback) ->
|
|
112
112
|
script.src = url
|
113
113
|
document.body.appendChild(script)
|
114
114
|
|
115
|
-
Luca.util.make =
|
115
|
+
Luca.util.make = (tagName="div", attributes={}, contents="")->
|
116
|
+
Luca.View::make.apply(@, arguments)
|
116
117
|
|
117
118
|
Luca.util.list = (list,options={},ordered)->
|
118
119
|
container = if ordered then "ol" else "ul"
|
data/bin/luca
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'faye'
|
7
|
+
require 'sass'
|
8
|
+
require 'coffee-script'
|
9
|
+
require 'redcarpet'
|
10
|
+
require 'listen'
|
11
|
+
require 'luca'
|
12
|
+
require 'luca/cli'
|
13
|
+
|
14
|
+
Luca::Cli::Base.start
|