luca 0.9.89 → 0.9.91
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 +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
|
@@ -1,29 +1,70 @@
|
|
|
1
|
+
# The Controller is a special type of CardView that is used to provide structure to a Luca.Application. Each
|
|
2
|
+
# component in the controller is expected to have a unique `@name` property. The Application's router configuration
|
|
3
|
+
# will map URL / Hashbangs to the `@name`s of components that belong to the Application controller.
|
|
4
|
+
#
|
|
5
|
+
# Applications which structure their 'pages' in controllers, or sections, will have the names of which
|
|
6
|
+
# section or page is active inside of its state model. One example / common application structure we see:
|
|
7
|
+
#
|
|
8
|
+
# application:
|
|
9
|
+
# main_controller:
|
|
10
|
+
# controller / section_one:
|
|
11
|
+
# page_one
|
|
12
|
+
# page_two
|
|
13
|
+
# page_three
|
|
14
|
+
# controller / section_two
|
|
15
|
+
# page_alpha
|
|
16
|
+
# page_bravo
|
|
17
|
+
#
|
|
18
|
+
# In the above example, the Application would attempt to route to page_one, and the state
|
|
19
|
+
# of the application may look like:
|
|
20
|
+
#
|
|
21
|
+
# application.activeSection() #=> 'section_one'
|
|
22
|
+
# application.activeSubSection() # => 'page_one'
|
|
23
|
+
# application.activePage() # => page_one
|
|
24
|
+
#
|
|
1
25
|
controller = Luca.register "Luca.components.Controller"
|
|
2
26
|
controller.extends "Luca.containers.CardView"
|
|
3
27
|
|
|
4
|
-
controller.
|
|
28
|
+
controller.publicConfiguration
|
|
29
|
+
# If there is an active application, we will attempt to
|
|
30
|
+
# set the name of our currently activated page on the application's
|
|
31
|
+
# state machine. The attribute we will set can be configured by setting this value.
|
|
5
32
|
tracker: "page"
|
|
6
33
|
|
|
34
|
+
# We will set the name of the active page / section on our DOM element
|
|
35
|
+
# The attribute we will set can be configured by setting this.
|
|
36
|
+
activeAttribute: "active-section"
|
|
37
|
+
stateful: true
|
|
38
|
+
defaultPage: undefined
|
|
39
|
+
defaultCard: 0
|
|
40
|
+
|
|
41
|
+
controller.publicMethods
|
|
42
|
+
# Navigate to the default ( or first ) component on this controller.
|
|
43
|
+
# This will automatically get called upon rendering, so that it sets up
|
|
44
|
+
# the proper state tracking, event binding, etc.
|
|
7
45
|
default: (callback)->
|
|
8
46
|
@navigate_to(@defaultPage || @defaultCard, callback)
|
|
9
47
|
|
|
48
|
+
# Returns the name of the component which is currently active
|
|
49
|
+
# on this controller.
|
|
10
50
|
activePage: ()->
|
|
11
51
|
@activeSection()
|
|
12
52
|
|
|
13
|
-
|
|
14
|
-
|
|
53
|
+
# Navigate to a page on this controller by name. If passed an optional
|
|
54
|
+
# callback, the callback will be called within the context of the activated page.
|
|
55
|
+
navigate_to: (page, callback)->
|
|
56
|
+
page ||= @defaultCard
|
|
15
57
|
|
|
16
|
-
@activate
|
|
58
|
+
@activate page, false, (activator, previous,current)=>
|
|
17
59
|
if current.activatedByController is true
|
|
18
60
|
current.trigger("on:controller:reactivation")
|
|
19
61
|
else
|
|
20
|
-
current.trigger("on:controller:reactivation")
|
|
21
62
|
current.trigger("on:controller:activation")
|
|
22
63
|
current.activatedByController = true
|
|
23
64
|
|
|
24
65
|
@state.set(active_section: current.name )
|
|
25
66
|
|
|
26
|
-
if app = Luca.getApplication?()
|
|
67
|
+
if @tracker? and app = @app || Luca.getApplication?()
|
|
27
68
|
app.state.set(@tracker, current.name)
|
|
28
69
|
|
|
29
70
|
Luca.key?.setScope( current.name )
|
|
@@ -31,15 +72,37 @@ controller.publicInterface
|
|
|
31
72
|
if _.isFunction( callback )
|
|
32
73
|
callback.call(current)
|
|
33
74
|
|
|
34
|
-
# return the
|
|
35
|
-
@find(
|
|
75
|
+
# return the component we are navigating to
|
|
76
|
+
@find(page)
|
|
36
77
|
|
|
37
78
|
controller.classMethods
|
|
79
|
+
# For each component we control, if there is a keyEvents property defined
|
|
80
|
+
# then we will define a keymaster scope for that component's name, and setup
|
|
81
|
+
# bindings as directed. This is important because each time a controller
|
|
82
|
+
# activates a component, that component will attempt to change the scope of
|
|
83
|
+
# the keymaster so that components becomes responsible for handling detected key events.
|
|
38
84
|
setupComponentKeyEvents: ()->
|
|
39
85
|
@_().each (component)->
|
|
40
86
|
if _.isObject(component.keyEvents) and component.name?
|
|
41
87
|
Luca.util.setupKeymaster(component.keyEvents, component.name).on(component)
|
|
42
88
|
|
|
89
|
+
# The Controller Path is an array of the names of the controllers
|
|
90
|
+
# a given component belongs to. This method will get patched on to each
|
|
91
|
+
# component that belongs to a controller. It will always be bound to the instance
|
|
92
|
+
# of the component itself. Example:
|
|
93
|
+
#
|
|
94
|
+
# application.contains
|
|
95
|
+
# name: "main_controller"
|
|
96
|
+
# components: [
|
|
97
|
+
# name: "sub_controller"
|
|
98
|
+
# components:[
|
|
99
|
+
# name: "page"
|
|
100
|
+
# ]
|
|
101
|
+
# ]
|
|
102
|
+
#
|
|
103
|
+
# The @controllerPath() method for the component named page would be ['sub_controller','page'].
|
|
104
|
+
# This will be used internally by the Application route builder, so that each of page's parent
|
|
105
|
+
# controllers are activated in the proper order needed to make page visible.
|
|
43
106
|
controllerPath: ()->
|
|
44
107
|
component = @
|
|
45
108
|
|
|
@@ -57,9 +120,6 @@ controller.afterDefinition ()->
|
|
|
57
120
|
Luca.View::hooks.push "on:controller:activation"
|
|
58
121
|
|
|
59
122
|
controller.defines
|
|
60
|
-
additionalClassNames: 'luca-ui-controller'
|
|
61
|
-
activeAttribute: "active-section"
|
|
62
|
-
stateful: true
|
|
63
123
|
|
|
64
124
|
initialize: (@options)->
|
|
65
125
|
# let's phase out the 'card' terminology
|
|
@@ -98,6 +158,7 @@ controller.defines
|
|
|
98
158
|
@availableSections.apply(@, arguments)
|
|
99
159
|
|
|
100
160
|
availableSections: ()->
|
|
161
|
+
console.log "The availableSections()/availablePages() method will be removed in 1.0"
|
|
101
162
|
base = {}
|
|
102
163
|
base[ @name ] = @sectionNames()
|
|
103
164
|
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# The `Luca.core.Field` is an abstract base class for field components
|
|
2
|
+
# which are used in the `Luca.components.FormView`. They provide common
|
|
3
|
+
# functionality like getValue, setValue, change and validation event bindings.
|
|
4
|
+
#
|
|
5
|
+
# Additionally, the field component provides common Twitter Bootstrap styling
|
|
6
|
+
# hooks, such as error, warning, and success status flagging.
|
|
1
7
|
field = Luca.register "Luca.core.Field"
|
|
2
8
|
|
|
3
9
|
field.extends "Luca.View"
|
|
@@ -7,39 +13,83 @@ field.triggers "before:validation",
|
|
|
7
13
|
"on:change"
|
|
8
14
|
|
|
9
15
|
field.publicConfiguration
|
|
16
|
+
className: 'luca-ui-field'
|
|
17
|
+
|
|
18
|
+
# Controls whether or not this field is rendered in a disabled state
|
|
19
|
+
disabled: undefined
|
|
20
|
+
|
|
21
|
+
# Controls the bootstrap helperText value for this field control
|
|
22
|
+
helperText: undefined
|
|
23
|
+
|
|
24
|
+
# Text value for the label element that goes along with this field control
|
|
25
|
+
label: undefined
|
|
26
|
+
|
|
27
|
+
# Controls the positioning of the label element. Valid options are
|
|
28
|
+
# 'top', 'left'. For any other custom display you can control this
|
|
29
|
+
# on your own by specifying a template
|
|
10
30
|
labelAlign: 'top'
|
|
11
|
-
|
|
31
|
+
|
|
32
|
+
# Controls the value displayed in this field when it is in an untouched state
|
|
33
|
+
# by the user. Uses the html5 placeholder attribute
|
|
34
|
+
placeHolder: undefined
|
|
35
|
+
|
|
36
|
+
# Controls whether or not we want to display visual indicator
|
|
37
|
+
# that this field is required.
|
|
38
|
+
required: undefined
|
|
39
|
+
|
|
40
|
+
# Which statuses can be applied to this field? Valid options are taken
|
|
41
|
+
# from bootstrap state styling.
|
|
12
42
|
statuses: [
|
|
13
43
|
"warning"
|
|
14
44
|
"error"
|
|
15
45
|
"success"
|
|
16
46
|
]
|
|
17
47
|
|
|
18
|
-
field
|
|
48
|
+
# What is the type of value that this field
|
|
49
|
+
# should have? You can use this to coerce the `getValue()` type
|
|
50
|
+
# into an integer, string, or float.
|
|
51
|
+
valueType: "string"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
field.publicMethods
|
|
56
|
+
# Disable this field
|
|
19
57
|
disable: ()->
|
|
20
58
|
@getInputElement().attr('disabled', true)
|
|
21
59
|
|
|
60
|
+
# Enable this field
|
|
22
61
|
enable: ()->
|
|
23
62
|
@getInputElement().attr('disabled', false)
|
|
24
63
|
|
|
64
|
+
# Gets the value from the input element in this field control
|
|
25
65
|
getValue: ()->
|
|
26
|
-
@
|
|
66
|
+
raw = @getInputElement()?.val()
|
|
67
|
+
@getParsedValue(raw)
|
|
27
68
|
|
|
69
|
+
# Sets the value on the input element inside this field control
|
|
28
70
|
setValue: (value)->
|
|
29
|
-
@getInputElement()?.
|
|
71
|
+
@getInputElement()?.val(value)
|
|
30
72
|
|
|
73
|
+
# Update the state of this field. Valid options are defined on
|
|
74
|
+
# this fields `@statuses` property
|
|
31
75
|
updateState: (state)->
|
|
32
|
-
|
|
33
|
-
@$el.removeClass(
|
|
76
|
+
for cssClass in @statuses
|
|
77
|
+
@$el.removeClass(cssClass)
|
|
78
|
+
|
|
34
79
|
@$el.addClass(state)
|
|
35
80
|
|
|
81
|
+
# Remove any visual error indications from this field control
|
|
36
82
|
clearErrors: ()->
|
|
37
83
|
@$el.removeClass('error')
|
|
38
84
|
|
|
85
|
+
# Display a visual error state on this field
|
|
39
86
|
displayErrors: (errors)->
|
|
40
87
|
@updateState('error')
|
|
41
88
|
|
|
42
|
-
field.
|
|
89
|
+
field.privateMethods
|
|
90
|
+
# Runs the value from the underlying input element
|
|
91
|
+
# through a type conversion process configured by
|
|
92
|
+
# the `@valueType` field
|
|
43
93
|
getParsedValue: (raw)->
|
|
44
94
|
return raw if _.str.isBlank( raw )
|
|
45
95
|
|
|
@@ -50,10 +100,11 @@ field.methods
|
|
|
50
100
|
else raw
|
|
51
101
|
|
|
52
102
|
field.privateConfiguration
|
|
103
|
+
# A convenience method for identifying field components
|
|
53
104
|
isField: true
|
|
54
105
|
template: 'fields/text_field'
|
|
55
106
|
|
|
56
|
-
field.
|
|
107
|
+
field.privateMethods
|
|
57
108
|
initialize: (@options={})->
|
|
58
109
|
_.extend @, @options
|
|
59
110
|
|
|
@@ -89,3 +140,5 @@ field.defines
|
|
|
89
140
|
|
|
90
141
|
getInputElement: ()->
|
|
91
142
|
@input ||= @$('input').eq(0)
|
|
143
|
+
|
|
144
|
+
field.register()
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# The `Luca.fields.ButtonField` provides an easy way to generate
|
|
2
|
+
# a button element, with an optional icon. Supports all of the
|
|
3
|
+
# available bootstrap icons, and color states.
|
|
4
|
+
#
|
|
5
|
+
# The `Luca.fields.ButtonField` component will typically be used as
|
|
6
|
+
# part of a `Luca.components.FormView` or a `Luca.components.PanelToolbar`.
|
|
1
7
|
buttonField = Luca.register "Luca.fields.ButtonField"
|
|
2
8
|
|
|
3
9
|
buttonField.extends "Luca.core.Field"
|
|
@@ -5,28 +11,62 @@ buttonField.extends "Luca.core.Field"
|
|
|
5
11
|
buttonField.triggers "button:click"
|
|
6
12
|
|
|
7
13
|
buttonField.publicConfiguration
|
|
14
|
+
# Which size should this button be? Valid options are:
|
|
15
|
+
# - none ( default )
|
|
16
|
+
# - large
|
|
17
|
+
# - mini
|
|
18
|
+
# - small
|
|
19
|
+
buttonSize: undefined
|
|
20
|
+
|
|
21
|
+
# Which bootstrap color class should we apply to this button?
|
|
22
|
+
# Valid options are any css button class, or the defaults which
|
|
23
|
+
# ship with bootstrap:
|
|
24
|
+
#
|
|
25
|
+
# - btn-primary
|
|
26
|
+
# - btn-info
|
|
27
|
+
# - btn-success
|
|
28
|
+
# - btn-warning
|
|
29
|
+
# - btn-danger
|
|
30
|
+
# - btn-inverse
|
|
31
|
+
# - btn-link
|
|
32
|
+
class: undefined
|
|
33
|
+
|
|
34
|
+
# specifies the bootstrap icon class you want to use for this button
|
|
35
|
+
# you can use 'icon-ok-sign' or just 'ok-sign'
|
|
36
|
+
icon_class: undefined
|
|
37
|
+
|
|
38
|
+
# specifies the text value of the button
|
|
39
|
+
label: undefined
|
|
40
|
+
|
|
41
|
+
# an alias for label, or input_value. controls which text
|
|
42
|
+
# displays inside of the button
|
|
43
|
+
text: undefined
|
|
44
|
+
|
|
45
|
+
# should we render the white icon?
|
|
46
|
+
white: false
|
|
47
|
+
|
|
48
|
+
buttonField.privateConfiguration
|
|
8
49
|
readOnly: true
|
|
9
50
|
input_value: undefined
|
|
10
51
|
input_type: "button"
|
|
11
52
|
icon_class: undefined
|
|
12
53
|
input_name: undefined
|
|
13
|
-
white: undefined
|
|
14
54
|
buttonClasses: ""
|
|
15
55
|
|
|
16
56
|
buttonField.privateConfiguration
|
|
17
57
|
isButton: true
|
|
58
|
+
autoBindEventHandlers: true
|
|
18
59
|
template: "fields/button_field"
|
|
19
60
|
events:
|
|
20
|
-
"click input" : "
|
|
61
|
+
"click input" : "clickHandler"
|
|
21
62
|
|
|
22
|
-
buttonField.
|
|
23
|
-
|
|
63
|
+
buttonField.privateMethods
|
|
64
|
+
clickHandler: (e)->
|
|
24
65
|
me = my = $( e.currentTarget )
|
|
25
66
|
@trigger "button:click"
|
|
26
67
|
|
|
27
68
|
initialize: (@options={})->
|
|
28
|
-
_.extend @options
|
|
29
|
-
_.bindAll @, "click_handler"
|
|
69
|
+
_.extend @, @options
|
|
30
70
|
|
|
31
71
|
Luca.core.Field::initialize.apply @, arguments
|
|
32
72
|
|
|
@@ -37,9 +77,15 @@ buttonField.privateInterface
|
|
|
37
77
|
@input_name ||= @name ||= @input_id
|
|
38
78
|
@input_value ||= @label ||= @text
|
|
39
79
|
@input_class ||= @class ||= @buttonClasses
|
|
80
|
+
|
|
81
|
+
if @buttonSize?.length > 0
|
|
82
|
+
@input_class += " #{ buttonSize.replace(/btn-/,'') }"
|
|
83
|
+
|
|
40
84
|
@icon_class ||= ""
|
|
41
85
|
@icon_class = "icon-#{ @icon_class }" if @icon_class.length and !@icon_class.match(/^icon-/)
|
|
42
86
|
@icon_class += " icon-white" if @white
|
|
43
87
|
|
|
44
|
-
setValue: ()->
|
|
88
|
+
setValue: ()->
|
|
89
|
+
true
|
|
45
90
|
|
|
91
|
+
buttonField.register()
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# The `Luca.fields.CheckboxArray` renders an array of values
|
|
2
|
+
# into checkbox controls. This is for fields which can have
|
|
3
|
+
# a list of values associated with them.
|
|
3
4
|
checkboxArray = Luca.register "Luca.fields.CheckboxArray"
|
|
4
5
|
checkboxArray.extends "Luca.core.Field"
|
|
5
6
|
|
|
6
|
-
checkboxArray.
|
|
7
|
-
version: 2
|
|
8
|
-
|
|
7
|
+
checkboxArray.privateConfiguration
|
|
9
8
|
template: "fields/checkbox_array"
|
|
10
9
|
|
|
11
10
|
className: "luca-ui-checkbox-array"
|
|
@@ -15,6 +14,7 @@ checkboxArray.defines
|
|
|
15
14
|
|
|
16
15
|
selectedItems: []
|
|
17
16
|
|
|
17
|
+
checkboxArray.privateMethods
|
|
18
18
|
initialize: (@options={})->
|
|
19
19
|
_.extend @, @options
|
|
20
20
|
_.extend @, Luca.concerns.Deferrable
|
|
@@ -65,8 +65,8 @@ checkboxArray.defines
|
|
|
65
65
|
label = model.get(@displayField)
|
|
66
66
|
input_id = _.uniqueId("#{ @cid }_checkbox")
|
|
67
67
|
|
|
68
|
-
inputElement = make("input",type:"checkbox",class:"array-checkbox",name:@input_name,value:value,id: input_id)
|
|
69
|
-
element = make("label", {for:input_id}, inputElement)
|
|
68
|
+
inputElement = @make("input",type:"checkbox",class:"array-checkbox",name:@input_name,value:value,id: input_id)
|
|
69
|
+
element = @make("label", {for:input_id}, inputElement)
|
|
70
70
|
|
|
71
71
|
$( element ).append(" #{ label }")
|
|
72
72
|
@controls().append( element )
|
|
@@ -80,6 +80,9 @@ checkboxArray.defines
|
|
|
80
80
|
allFields: ()->
|
|
81
81
|
@controls().find("input[type='checkbox']")
|
|
82
82
|
|
|
83
|
+
checkboxArray.publicMethods
|
|
84
|
+
# Check the selected items. Expects an array of values
|
|
85
|
+
# for boxes you would like to see checked.
|
|
83
86
|
checkSelected: (items)->
|
|
84
87
|
@selectedItems = items if items?
|
|
85
88
|
|
|
@@ -91,6 +94,8 @@ checkboxArray.defines
|
|
|
91
94
|
|
|
92
95
|
@selectedItems
|
|
93
96
|
|
|
97
|
+
# Gets an array of values for the checkboxes in this array
|
|
98
|
+
# which are checked.
|
|
94
99
|
getValue: ()->
|
|
95
100
|
@$(field).val() for field in @allFields() when @$(field).prop('checked')
|
|
96
101
|
|
|
@@ -96,7 +96,7 @@ formView.privateConfiguration
|
|
|
96
96
|
# These events will get registered on the component
|
|
97
97
|
# but still leave the @events property open to extend
|
|
98
98
|
# for any component which inherits from us.
|
|
99
|
-
|
|
99
|
+
_inheritEvents:
|
|
100
100
|
"click .submit-button" : "submitHandler"
|
|
101
101
|
"click .reset-button" : "resetHandler"
|
|
102
102
|
|
|
@@ -120,7 +120,7 @@ formView.privateMethods
|
|
|
120
120
|
|
|
121
121
|
# have our events be internal to the view, and not
|
|
122
122
|
# part of the normal @events chain, so they can be inherited
|
|
123
|
-
for eventId, handler of @
|
|
123
|
+
for eventId, handler of @_inheritEvents
|
|
124
124
|
@registerEvent(eventId, handler)
|
|
125
125
|
|
|
126
126
|
if @trackDirtyState is true
|
|
@@ -26,6 +26,7 @@ page.privateMethods
|
|
|
26
26
|
initialize: (@options={})->
|
|
27
27
|
@assignComponentsToRegions()
|
|
28
28
|
@bodyTemplate = @options.layout || @layout
|
|
29
|
+
@bodyTemplate ||= @options.template || @template
|
|
29
30
|
Luca.Container::initialize.apply(@, arguments)
|
|
30
31
|
|
|
31
32
|
# Takes the configuration specified in @regions
|
|
@@ -67,7 +67,7 @@ tableView.classMethods
|
|
|
67
67
|
content = column.header
|
|
68
68
|
content = "<a class='link'>#{ column.header }</a>" if column.sortable
|
|
69
69
|
|
|
70
|
-
@$(targetElement).find('tr').append(
|
|
70
|
+
@$(targetElement).find('tr').append( Luca.View::make "th", attrs, content )
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
index = 0
|
|
@@ -88,6 +88,6 @@ tableView.classMethods
|
|
|
88
88
|
if _.isFunction( column.renderer )
|
|
89
89
|
cellValue = column.renderer.call @, cellValue, model, column
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
Luca.View::make("td", {"data-col-index":index}, cellValue)
|
|
92
92
|
|
|
93
93
|
tableView.register()
|
|
@@ -46,10 +46,10 @@ Luca.concerns.DomHelpers =
|
|
|
46
46
|
console.log "Error in $template: #{ template } #{ @identifier?() ? @name || @cid }"
|
|
47
47
|
|
|
48
48
|
$html: (content)->
|
|
49
|
-
@$el.html(
|
|
49
|
+
if content? then @$el.html(content) else @$el.html()
|
|
50
50
|
|
|
51
51
|
$append: (content)->
|
|
52
|
-
@$el.append(
|
|
52
|
+
@$el.append(content)
|
|
53
53
|
|
|
54
54
|
$attach: ()->
|
|
55
55
|
@$container().append( @el )
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
component = Luca.define "Luca.containers.CardView"
|
|
2
|
-
component.extends "Luca.Container"
|
|
3
|
-
|
|
4
|
-
component.aliases "Luca.PageView"
|
|
5
|
-
#
|
|
6
1
|
# The CardView is a type of Container which has many sub-views
|
|
7
2
|
# which are only going to be visible one at a time. A CardView
|
|
8
3
|
# allows you to @activate() its cards, navigate through them using
|
|
@@ -23,72 +18,70 @@ component.aliases "Luca.PageView"
|
|
|
23
18
|
# cardView.activeComponent().name # => "one"
|
|
24
19
|
# cardView.activate('two')
|
|
25
20
|
# cardView.activeComponent().name # => "two"
|
|
26
|
-
|
|
27
|
-
component.
|
|
28
|
-
activeCard: 0
|
|
21
|
+
component = Luca.register "Luca.containers.CardView"
|
|
22
|
+
component.extends "Luca.Container"
|
|
29
23
|
|
|
24
|
+
component.publicConfiguration
|
|
25
|
+
activeCard: 0
|
|
30
26
|
components: []
|
|
31
27
|
|
|
28
|
+
component.classInterface
|
|
29
|
+
# When the activate method is called and passed a callback
|
|
30
|
+
# what context should we run that callback in? Default is
|
|
31
|
+
# to call the callback in the context of the component that
|
|
32
|
+
# is currently being activated
|
|
33
|
+
activationContext: "current"
|
|
34
|
+
|
|
35
|
+
component.privateConfiguration
|
|
36
|
+
# Will automatically call beforeCardSwitch and afterCardSwitch
|
|
37
|
+
# methods if they exist on this view. These events will be triggered
|
|
38
|
+
# in response to a call to @activate()
|
|
32
39
|
hooks:[
|
|
33
40
|
'before:card:switch',
|
|
34
41
|
'after:card:switch'
|
|
35
42
|
]
|
|
36
43
|
|
|
44
|
+
# Which css class should we apply to each of the cards
|
|
37
45
|
componentClass: 'luca-ui-card'
|
|
38
|
-
generateComponentElements: true
|
|
39
|
-
|
|
40
|
-
initialize: (@options)->
|
|
41
|
-
@components ||= @pages ||= @cards
|
|
42
|
-
Luca.Container::initialize.apply @,arguments
|
|
43
|
-
@setupHooks(@hooks)
|
|
44
|
-
|
|
45
|
-
@defer( @simulateActivationEvent, @ ).until("after:render")
|
|
46
|
-
|
|
47
|
-
simulateActivationEvent: ()->
|
|
48
|
-
c = @activeComponent()
|
|
49
46
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
prepareComponents: ()->
|
|
54
|
-
Luca.Container::prepareComponents?.apply(@, arguments)
|
|
55
|
-
@componentElements().hide()
|
|
56
|
-
@activeComponentElement().show()
|
|
57
|
-
|
|
58
|
-
activeComponentElement: ()->
|
|
59
|
-
@componentElements().eq( @activeCard )
|
|
60
|
-
|
|
61
|
-
activeComponent: ()->
|
|
62
|
-
@getComponent( @activeCard )
|
|
63
|
-
|
|
64
|
-
customizeContainerEl: (containerEl, panel, panelIndex)->
|
|
65
|
-
containerEl.style += if panelIndex is @activeCard then "display:block;" else "display:none;"
|
|
66
|
-
|
|
67
|
-
containerEl
|
|
47
|
+
# Should we generate elements to append each component?
|
|
48
|
+
generateComponentElements: true
|
|
68
49
|
|
|
50
|
+
component.publicMethods
|
|
51
|
+
# Returns true if at the first
|
|
69
52
|
atFirst: ()->
|
|
70
53
|
@activeCard is 0
|
|
71
54
|
|
|
55
|
+
# Returns true if we're at the last card
|
|
72
56
|
atLast: ()->
|
|
73
57
|
@activeCard is @components.length - 1
|
|
74
58
|
|
|
59
|
+
# Activate the next component. If at the last, do nothing.
|
|
75
60
|
next: ()->
|
|
76
61
|
return if @atLast()
|
|
77
62
|
@activate( @activeCard + 1)
|
|
78
63
|
|
|
64
|
+
# Activate the previous component. If at the first, do nothing.
|
|
79
65
|
previous: ()->
|
|
80
66
|
return if @atFirst()
|
|
81
67
|
@activate( @activeCard - 1)
|
|
82
68
|
|
|
69
|
+
# Activates the next component after the current one.
|
|
70
|
+
# If at the last component, it will activate the first.
|
|
83
71
|
cycle: ()->
|
|
84
72
|
nextIndex = if @atLast() then 0 else @activeCard + 1
|
|
85
73
|
@activate( nextIndex )
|
|
86
74
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
75
|
+
# Find a direct component on this card by its name.
|
|
76
|
+
find: (name)->
|
|
77
|
+
_( @components ).detect (c)->
|
|
78
|
+
c.name is name
|
|
91
79
|
|
|
80
|
+
# Activates the component at the specified index. You may optionally specify
|
|
81
|
+
# the name of the component you wish to activate. You can pass false as your second
|
|
82
|
+
# argument, to disable the event handling that occurs when you activate a card on this container.
|
|
83
|
+
# If you pass a callback function to the activate method, that callback will be executed within
|
|
84
|
+
# the context of the activated component.
|
|
92
85
|
activate: (index, silent=false, callback)->
|
|
93
86
|
if _.isFunction(silent)
|
|
94
87
|
silent = false
|
|
@@ -97,14 +90,12 @@ component.defaults
|
|
|
97
90
|
return if index is @activeCard
|
|
98
91
|
|
|
99
92
|
previous = @activeComponent()
|
|
100
|
-
current = @getComponent(index)
|
|
101
93
|
|
|
102
|
-
|
|
103
|
-
index = @indexOf(index)
|
|
104
|
-
current = @getComponent( index )
|
|
94
|
+
current = @getComponent(index)
|
|
105
95
|
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
if !current?
|
|
97
|
+
index = @indexOf(index)
|
|
98
|
+
return unless current = @getComponent(index)
|
|
108
99
|
|
|
109
100
|
unless silent is true
|
|
110
101
|
@trigger "before:card:switch", previous, current
|
|
@@ -120,21 +111,18 @@ component.defaults
|
|
|
120
111
|
if current.rendered is true
|
|
121
112
|
current.trigger "first:activation"
|
|
122
113
|
else
|
|
123
|
-
current.
|
|
114
|
+
current.once "after:render", ()->
|
|
115
|
+
current.rendered = true
|
|
124
116
|
current.trigger("first:activation")
|
|
125
|
-
.until current, "after:render"
|
|
126
|
-
|
|
127
117
|
current.previously_activated = true
|
|
128
118
|
|
|
129
|
-
@activeCard = index
|
|
119
|
+
@activeCard = index
|
|
130
120
|
@activeComponentElement().show()
|
|
131
121
|
|
|
132
122
|
unless silent is true
|
|
133
123
|
@trigger "after:card:switch", previous, current
|
|
134
124
|
previous?.trigger "deactivation", @, previous, current
|
|
135
|
-
current?.trigger "on:deactivation", @, previous, current
|
|
136
125
|
current?.trigger "activation", @, previous, current
|
|
137
|
-
current?.trigger "on:activation", @, previous, current
|
|
138
126
|
|
|
139
127
|
activationContext = @
|
|
140
128
|
|
|
@@ -144,5 +132,47 @@ component.defaults
|
|
|
144
132
|
if _.isFunction(callback)
|
|
145
133
|
callback.apply activationContext, [@,previous,current]
|
|
146
134
|
|
|
135
|
+
component.privateMethods
|
|
136
|
+
initialize: (@options)->
|
|
137
|
+
@components ||= @pages ||= @cards
|
|
138
|
+
Luca.Container::initialize.apply @,arguments
|
|
139
|
+
@setupHooks(@hooks)
|
|
140
|
+
@defer( @simulateActivationEvent, @ ).until("after:render")
|
|
141
|
+
|
|
142
|
+
# Simulates the activation event being triggered on the
|
|
143
|
+
# active component that gets rendered inside of this card view.
|
|
144
|
+
simulateActivationEvent: ()->
|
|
145
|
+
c = @activeComponent()
|
|
146
|
+
|
|
147
|
+
if c? and (@visible || @$el.is(":visible"))
|
|
148
|
+
c?.trigger "activation", @, c, c
|
|
149
|
+
if !c.previously_activated
|
|
150
|
+
c.trigger "first:activation"
|
|
151
|
+
c.previously_activated = true
|
|
152
|
+
|
|
153
|
+
prepareComponents: ()->
|
|
154
|
+
Luca.Container::prepareComponents?.apply(@, arguments)
|
|
155
|
+
@componentElements().hide()
|
|
156
|
+
@activeComponentElement().show()
|
|
157
|
+
|
|
158
|
+
activeComponentElement: ()->
|
|
159
|
+
@componentElements().eq( @activeCard )
|
|
160
|
+
|
|
161
|
+
activeComponent: ()->
|
|
162
|
+
@getComponent( @activeCard )
|
|
163
|
+
|
|
164
|
+
customizeContainerEl: (containerEl, panel, panelIndex)->
|
|
165
|
+
containerEl.style += if panelIndex is @activeCard then "display:block;" else "display:none;"
|
|
166
|
+
|
|
167
|
+
containerEl
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# The first time activate event is triggered on this component
|
|
172
|
+
# the @firstActivation hook is responsible for relaying that event
|
|
173
|
+
# to our @activeComponent() so that it knows it has been activated.
|
|
174
|
+
firstActivation: ()->
|
|
175
|
+
if activeComponent = @activeComponent()
|
|
176
|
+
activeComponent.trigger "first:activation", @, @activeComponent()
|
|
147
177
|
|
|
148
|
-
|
|
178
|
+
component.register()
|