luca 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +17 -0
  3. data/Gemfile.lock +77 -0
  4. data/Guardfile +22 -0
  5. data/README.md +291 -0
  6. data/Rakefile +28 -0
  7. data/app.rb +46 -0
  8. data/assets/images/glyphicons-halflings-white.png +0 -0
  9. data/assets/images/glyphicons-halflings.png +0 -0
  10. data/assets/javascripts/dependencies/backbone-min.js +37 -0
  11. data/assets/javascripts/dependencies/backbone-query.min.js +1 -0
  12. data/assets/javascripts/dependencies/bootstrap.min.js +1 -0
  13. data/assets/javascripts/dependencies/jasmine-html.js +190 -0
  14. data/assets/javascripts/dependencies/jasmine.js +2476 -0
  15. data/assets/javascripts/dependencies/jquery.js +4 -0
  16. data/assets/javascripts/dependencies/modal.js +698 -0
  17. data/assets/javascripts/dependencies/modernizr.min.js +30 -0
  18. data/assets/javascripts/dependencies/prettify.js +28 -0
  19. data/assets/javascripts/dependencies/sinon.js +3469 -0
  20. data/assets/javascripts/dependencies/spin-min.js +2 -0
  21. data/assets/javascripts/dependencies/underscore-min.js +31 -0
  22. data/assets/javascripts/dependencies/underscore-string.min.js +14 -0
  23. data/assets/javascripts/dependencies.coffee +7 -0
  24. data/assets/javascripts/luca-ui-base.coffee +12 -0
  25. data/assets/javascripts/luca-ui-spec.coffee +2 -0
  26. data/assets/javascripts/luca-ui.coffee +3 -0
  27. data/assets/javascripts/sandbox/collections/sample.coffee +0 -0
  28. data/assets/javascripts/sandbox/config.coffee +7 -0
  29. data/assets/javascripts/sandbox/sandbox.coffee +16 -0
  30. data/assets/javascripts/sandbox/templates/features/collection_helpers.luca +33 -0
  31. data/assets/javascripts/sandbox/templates/features/form_demo_code.luca +48 -0
  32. data/assets/javascripts/sandbox/templates/features/grid_demo_code.luca +24 -0
  33. data/assets/javascripts/sandbox/templates/features/introduction.luca +11 -0
  34. data/assets/javascripts/sandbox/templates/features/view_helpers.luca +43 -0
  35. data/assets/javascripts/sandbox/templates/navigation.luca +8 -0
  36. data/assets/javascripts/sandbox/views/form_demo.coffee +47 -0
  37. data/assets/javascripts/sandbox/views/grid_demo.coffee +23 -0
  38. data/assets/javascripts/sandbox/views/pages/collection_events_sample.coffee +1 -0
  39. data/assets/javascripts/sandbox/views/pages/pages_controller.coffee +28 -0
  40. data/assets/javascripts/sandbox.coffee +4 -0
  41. data/assets/javascripts/spec-dependencies.coffee +4 -0
  42. data/assets/stylesheets/bootstrap-responsive.min.css +3 -0
  43. data/assets/stylesheets/bootstrap.min.css +610 -0
  44. data/assets/stylesheets/jasmine.css +166 -0
  45. data/assets/stylesheets/luca-ui-bootstrap.css +5 -0
  46. data/assets/stylesheets/luca-ui-spec.css +3 -0
  47. data/assets/stylesheets/luca-ui.css +3 -0
  48. data/assets/stylesheets/prettify.css +40 -0
  49. data/assets/stylesheets/sandbox/sandbox.scss +4 -0
  50. data/assets/stylesheets/sandbox.css +3 -0
  51. data/config.ru +11 -0
  52. data/lib/luca/command_line.rb +69 -0
  53. data/lib/luca/rails/engine.rb +12 -0
  54. data/lib/luca/rails/version.rb +6 -0
  55. data/lib/luca/rails.rb +9 -0
  56. data/lib/luca/template.rb +51 -0
  57. data/lib/luca/test_harness.rb +106 -0
  58. data/lib/luca.rb +1 -0
  59. data/lib/sprockets/luca_template.rb +49 -0
  60. data/lib/templates/spec_manifest_javascripts.erb +7 -0
  61. data/lib/templates/spec_manifest_stylesheets.erb +11 -0
  62. data/luca.gemspec +26 -0
  63. data/public/jasmine/index.html +26 -0
  64. data/public/sandbox/api.js +1 -0
  65. data/spec/components/application_spec.coffee +0 -0
  66. data/spec/components/collection_loader_view_spec.coffee +0 -0
  67. data/spec/components/controller_spec.coffee +0 -0
  68. data/spec/components/form_view_spec.coffee +13 -0
  69. data/spec/components/grid_view_spec.coffee +0 -0
  70. data/spec/components/record_manager_spec.coffee +0 -0
  71. data/spec/components/template_spec.coffee +0 -0
  72. data/spec/containers/card_view_spec.coffee +1 -0
  73. data/spec/containers/column_view_spec.coffee +0 -0
  74. data/spec/containers/modal_view_spec.coffee +0 -0
  75. data/spec/containers/panel_view_spec.coffee +0 -0
  76. data/spec/containers/split_view_spec.coffee +0 -0
  77. data/spec/containers/tab_view_spec.coffee +0 -0
  78. data/spec/containers/viewport_spec.coffee +0 -0
  79. data/spec/core/collection_spec.coffee +215 -0
  80. data/spec/core/container_spec.coffee +0 -0
  81. data/spec/core/field_spec.coffee +0 -0
  82. data/spec/core/observer_spec.coffee +0 -0
  83. data/spec/core/view_spec.coffee +87 -0
  84. data/spec/framework_spec.coffee +48 -0
  85. data/spec/helper.coffee +120 -0
  86. data/spec/managers/collection_manager_spec.coffee +95 -0
  87. data/spec/managers/socket_manager_spec.coffee +0 -0
  88. data/src/components/application.coffee +83 -0
  89. data/src/components/base_toolbar.coffee +16 -0
  90. data/src/components/collection_loader_view.coffee +37 -0
  91. data/src/components/controller.coffee +41 -0
  92. data/src/components/fields/button_field.coffee +40 -0
  93. data/src/components/fields/checkbox_field.coffee +41 -0
  94. data/src/components/fields/file_upload_field.coffee +15 -0
  95. data/src/components/fields/hidden_field.coffee +18 -0
  96. data/src/components/fields/select_field.coffee +100 -0
  97. data/src/components/fields/text_area_field.coffee +43 -0
  98. data/src/components/fields/text_field.coffee +42 -0
  99. data/src/components/fields/type_ahead_field.coffee +10 -0
  100. data/src/components/form_button_toolbar.coffee +26 -0
  101. data/src/components/form_view.coffee +205 -0
  102. data/src/components/grid_view.coffee +208 -0
  103. data/src/components/record_manager.coffee +215 -0
  104. data/src/components/router.coffee +34 -0
  105. data/src/components/template.coffee +19 -0
  106. data/src/containers/card_view.coffee +89 -0
  107. data/src/containers/column_view.coffee +48 -0
  108. data/src/containers/modal_view.coffee +85 -0
  109. data/src/containers/panel_view.coffee +24 -0
  110. data/src/containers/split_view.coffee +12 -0
  111. data/src/containers/tab_view.coffee +77 -0
  112. data/src/containers/viewport.coffee +16 -0
  113. data/src/core/collection.coffee +319 -0
  114. data/src/core/container.coffee +256 -0
  115. data/src/core/field.coffee +68 -0
  116. data/src/core/observer.coffee +17 -0
  117. data/src/core/view.coffee +190 -0
  118. data/src/framework.coffee +110 -0
  119. data/src/index.coffee +255 -0
  120. data/src/managers/collection_manager.coffee +168 -0
  121. data/src/managers/socket_manager.coffee +54 -0
  122. data/src/modules/deferrable.coffee +18 -0
  123. data/src/modules/local_storage.coffee +50 -0
  124. data/src/stylesheets/base.scss +78 -0
  125. data/src/stylesheets/components/form_view.scss +54 -0
  126. data/src/stylesheets/components/grid_view.scss +111 -0
  127. data/src/stylesheets/components/toolbar.scss +15 -0
  128. data/src/stylesheets/containers/container.scss +7 -0
  129. data/src/stylesheets/containers/modal_view.scss +0 -0
  130. data/src/stylesheets/containers/tab_view.scss +33 -0
  131. data/src/stylesheets/normalize.scss +430 -0
  132. data/src/templates/components/bootstrap_form_controls.luca +7 -0
  133. data/src/templates/components/collection_loader_view.luca +5 -0
  134. data/src/templates/components/form_view.luca +15 -0
  135. data/src/templates/components/grid_view.luca +9 -0
  136. data/src/templates/components/grid_view_empty_text.luca +3 -0
  137. data/src/templates/containers/basic.luca +1 -0
  138. data/src/templates/containers/tab_selector_container.luca +8 -0
  139. data/src/templates/containers/tab_view.luca +1 -0
  140. data/src/templates/containers/toolbar_wrapper.luca +1 -0
  141. data/src/templates/fields/button_field.luca +2 -0
  142. data/src/templates/fields/button_field_link.luca +5 -0
  143. data/src/templates/fields/checkbox_field.luca +9 -0
  144. data/src/templates/fields/file_upload_field.luca +8 -0
  145. data/src/templates/fields/hidden_field.luca +1 -0
  146. data/src/templates/fields/select_field.luca +7 -0
  147. data/src/templates/fields/text_area_field.luca +8 -0
  148. data/src/templates/fields/text_field.luca +13 -0
  149. data/src/templates/sample/contents.luca +1 -0
  150. data/src/templates/sample/welcome.luca +1 -0
  151. data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  152. data/vendor/assets/images/glyphicons-halflings.png +0 -0
  153. data/vendor/assets/javascripts/luca-spec-dependencies.js +6135 -0
  154. data/vendor/assets/javascripts/luca-ui-base.js +1527 -0
  155. data/vendor/assets/javascripts/luca-ui-spec.js +3654 -0
  156. data/vendor/assets/javascripts/luca-ui.js +2763 -0
  157. data/vendor/assets/luca-ui/base.css +85 -0
  158. data/vendor/assets/luca-ui/components/application.js +91 -0
  159. data/vendor/assets/luca-ui/components/base_toolbar.js +23 -0
  160. data/vendor/assets/luca-ui/components/controller.js +38 -0
  161. data/vendor/assets/luca-ui/components/fields/button_field.js +45 -0
  162. data/vendor/assets/luca-ui/components/fields/checkbox_field.js +43 -0
  163. data/vendor/assets/luca-ui/components/fields/file_upload_field.js +20 -0
  164. data/vendor/assets/luca-ui/components/fields/hidden_field.js +20 -0
  165. data/vendor/assets/luca-ui/components/fields/select_field.js +97 -0
  166. data/vendor/assets/luca-ui/components/fields/text_area_field.js +48 -0
  167. data/vendor/assets/luca-ui/components/fields/text_field.js +46 -0
  168. data/vendor/assets/luca-ui/components/fields/type_ahead_field.js +13 -0
  169. data/vendor/assets/luca-ui/components/form_button_toolbar.js +32 -0
  170. data/vendor/assets/luca-ui/components/form_view.css +32 -0
  171. data/vendor/assets/luca-ui/components/form_view.js +207 -0
  172. data/vendor/assets/luca-ui/components/grid_view.css +76 -0
  173. data/vendor/assets/luca-ui/components/grid_view.js +202 -0
  174. data/vendor/assets/luca-ui/components/record_manager.js +207 -0
  175. data/vendor/assets/luca-ui/components/router.js +36 -0
  176. data/vendor/assets/luca-ui/components/template.js +26 -0
  177. data/vendor/assets/luca-ui/components/toolbar.css +11 -0
  178. data/vendor/assets/luca-ui/containers/card_view.js +98 -0
  179. data/vendor/assets/luca-ui/containers/column_view.js +52 -0
  180. data/vendor/assets/luca-ui/containers/container.css +3 -0
  181. data/vendor/assets/luca-ui/containers/modal_view.css +0 -0
  182. data/vendor/assets/luca-ui/containers/modal_view.js +87 -0
  183. data/vendor/assets/luca-ui/containers/panel_view.js +34 -0
  184. data/vendor/assets/luca-ui/containers/split_view.js +13 -0
  185. data/vendor/assets/luca-ui/containers/tab_view.css +16 -0
  186. data/vendor/assets/luca-ui/containers/tab_view.js +80 -0
  187. data/vendor/assets/luca-ui/containers/viewport.js +18 -0
  188. data/vendor/assets/luca-ui/core/collection.js +221 -0
  189. data/vendor/assets/luca-ui/core/container.js +205 -0
  190. data/vendor/assets/luca-ui/core/field.js +59 -0
  191. data/vendor/assets/luca-ui/core/observer.js +42 -0
  192. data/vendor/assets/luca-ui/core/view.js +127 -0
  193. data/vendor/assets/luca-ui/framework.js +110 -0
  194. data/vendor/assets/luca-ui/index.js +5 -0
  195. data/vendor/assets/luca-ui/managers/collection_manager.js +98 -0
  196. data/vendor/assets/luca-ui/managers/socket_manager.js +52 -0
  197. data/vendor/assets/luca-ui/modules/deferrable.js +21 -0
  198. data/vendor/assets/luca-ui/modules/local_storage.js +81 -0
  199. data/vendor/assets/luca-ui/normalize.css +359 -0
  200. data/vendor/assets/luca-ui/stylesheets/base.css +85 -0
  201. data/vendor/assets/luca-ui/stylesheets/components/form_view.css +32 -0
  202. data/vendor/assets/luca-ui/stylesheets/components/grid_view.css +76 -0
  203. data/vendor/assets/luca-ui/stylesheets/components/toolbar.css +11 -0
  204. data/vendor/assets/luca-ui/stylesheets/containers/container.css +3 -0
  205. data/vendor/assets/luca-ui/stylesheets/containers/modal_view.css +0 -0
  206. data/vendor/assets/luca-ui/stylesheets/containers/tab_view.css +16 -0
  207. data/vendor/assets/luca-ui/stylesheets/normalize.css +359 -0
  208. data/vendor/assets/luca-ui/templates/components/bootstrap_form_controls.js +4 -0
  209. data/vendor/assets/luca-ui/templates/components/form_view.js +4 -0
  210. data/vendor/assets/luca-ui/templates/components/grid_view.js +4 -0
  211. data/vendor/assets/luca-ui/templates/components/grid_view_empty_text.js +4 -0
  212. data/vendor/assets/luca-ui/templates/containers/basic.js +4 -0
  213. data/vendor/assets/luca-ui/templates/containers/tab_selector_container.js +4 -0
  214. data/vendor/assets/luca-ui/templates/containers/tab_view.js +4 -0
  215. data/vendor/assets/luca-ui/templates/containers/toolbar_wrapper.js +4 -0
  216. data/vendor/assets/luca-ui/templates/fields/button_field.js +4 -0
  217. data/vendor/assets/luca-ui/templates/fields/button_field_link.js +4 -0
  218. data/vendor/assets/luca-ui/templates/fields/checkbox_field.js +4 -0
  219. data/vendor/assets/luca-ui/templates/fields/file_upload_field.js +4 -0
  220. data/vendor/assets/luca-ui/templates/fields/hidden_field.js +4 -0
  221. data/vendor/assets/luca-ui/templates/fields/select_field.js +4 -0
  222. data/vendor/assets/luca-ui/templates/fields/text_area_field.js +4 -0
  223. data/vendor/assets/luca-ui/templates/fields/text_field.js +4 -0
  224. data/vendor/assets/luca-ui/templates/sample/contents.js +4 -0
  225. data/vendor/assets/luca-ui/templates/sample/welcome.js +4 -0
  226. data/vendor/assets/stylesheets/luca-spec-dependencies.css +166 -0
  227. data/vendor/assets/stylesheets/luca-ui-bootstrap.css +1201 -0
  228. data/vendor/assets/stylesheets/luca-ui-spec.css +586 -0
  229. data/vendor/assets/stylesheets/luca-ui.css +586 -0
  230. data/views/index.erb +20 -0
  231. data/views/jasmine.erb +22 -0
  232. data/views/spec_harness.erb +29 -0
  233. metadata +361 -0
@@ -0,0 +1,83 @@
1
+ Luca.Application = Luca.containers.Viewport.extend
2
+
3
+ components:[
4
+ ctype: 'controller'
5
+ name: 'main_controller'
6
+ defaultCard: 'welcome'
7
+ components:[
8
+ ctype: 'template'
9
+ name: 'welcome'
10
+ template: 'sample/welcome'
11
+ templateContainer: "Luca.templates"
12
+ ]
13
+ ]
14
+
15
+ initialize: (@options={})->
16
+ Luca.containers.Viewport::initialize.apply @, arguments
17
+
18
+ @collectionManager = new Luca.CollectionManager()
19
+
20
+ @state = new Backbone.Model( @defaultState )
21
+
22
+ @bind "ready", ()=> @render()
23
+
24
+ activeView: ()->
25
+ if active = @activeSubSection()
26
+ @view( active )
27
+ else
28
+ @view( @activeSection() )
29
+
30
+ activeSubSection: ()->
31
+ @get("active_sub_section")
32
+
33
+ activeSection: ()->
34
+ @get("active_section")
35
+
36
+ afterComponents: ()->
37
+ Luca.containers.Viewport::afterComponents?.apply @, arguments
38
+
39
+ # any time the main controller card switches we should track
40
+ # the active card on the global state chart
41
+ @getMainController()?.bind "after:card:switch", (previous,current)=>
42
+ @state.set(active_section:current.name)
43
+
44
+ # any time the card switches on one of the sub controllers
45
+ # then we should track the active sub section on the global state chart
46
+ @getMainController()?.each (component)=>
47
+ if component.ctype.match(/controller$/)
48
+ component.bind "after:card:switch", (previous,current)=>
49
+ @state.set(active_sub_section:current.name)
50
+
51
+ beforeRender: ()->
52
+ Luca.containers.Viewport::beforeRender?.apply @, arguments
53
+ #Backbone.history.start()
54
+
55
+ # boot should trigger the ready event, which will call the initial call
56
+ # to render() your application, which will have a cascading effect on every
57
+ # subcomponent in the view, recursively rendering everything which is set
58
+ # to automatically render (i.e. any non-deferrable components ).
59
+ #
60
+ # you should use boot to fire up any dependent collections, manager, any
61
+ # sort of data processing, whatever your application requires to run outside
62
+ # of the views
63
+ boot: ()->
64
+ console.log "Sup?"
65
+ @trigger "ready"
66
+
67
+
68
+ # delegate to the collection manager's get or create function.
69
+ # use App.collection() to create or access existing collections
70
+ collection: ()->
71
+ @collectionManager.getOrCreate.apply(@collectionManager, arguments)
72
+
73
+ get: (attribute)->
74
+ @state.get(attribute)
75
+
76
+ getMainController: ()->
77
+ @view("main_controler")
78
+
79
+ set: (attributes)->
80
+ @state.set(attributes)
81
+
82
+ view: (name)-> Luca.cache(name)
83
+
@@ -0,0 +1,16 @@
1
+ Luca.components.Toolbar = Luca.core.Container.extend
2
+ className: 'luca-ui-toolbar'
3
+
4
+ position: 'bottom'
5
+
6
+ initialize: (@options={})->
7
+ Luca.core.Container::initialize.apply @, arguments
8
+
9
+ prepareComponents: ()->
10
+ _( @components ).each (component)=>
11
+ component.container = @el
12
+
13
+ render: ()->
14
+ $(@container).append(@el)
15
+
16
+ Luca.register "toolbar", "Luca.components.Toolbar"
@@ -0,0 +1,37 @@
1
+ # Collection Loader View is a simple modal view
2
+ # You can provide your own template for the collection loader modal
3
+ # if you want to. Default implementation uses twitter bootstrap modal and
4
+ # progress bar (http://twitter.github.com/bootstrap/). You template
5
+ # should have contain `progress`, `bar` and `message` classes
6
+ Luca.components.CollectionLoaderView = Luca.components.Template.extend
7
+ className: 'luca-ui-collection-loader-view'
8
+
9
+ template: "components/collection_loader_view"
10
+
11
+ initialize: (@options={})->
12
+ Luca.components.Template::initialize.apply @,arguments
13
+
14
+ @container ||= $('body')
15
+ @manager ||= Luca.CollectionManager.get()
16
+
17
+ @setupBindings()
18
+
19
+ modalContainer: ()->
20
+ $("#progress-modal", @el)
21
+
22
+ setupBindings: ()->
23
+ @manager.bind "collection_loaded", (name)=>
24
+ loaded = @manager.loadedCollectionsCount()
25
+ total = @manager.totalCollectionsCount()
26
+ progress = parseInt((loaded / total) * 100)
27
+
28
+ @modalContainer().find('.progress .bar').attr("style", "width: #{progress}%;")
29
+ @modalContainer().find('.message').html("Loaded #{ _(name).chain().humanize().titleize().value() }...")
30
+
31
+ @manager.bind "all_collections_loaded", ()=>
32
+ @modalContainer().find('.message').html("All done!")
33
+ _.delay ()=>
34
+ @modalContainer().modal('hide')
35
+ , 400
36
+
37
+ Luca.register "collection_loader_view","Luca.components.CollectionLoaderView"
@@ -0,0 +1,41 @@
1
+ Luca.components.Controller = Luca.containers.CardView.extend
2
+ initialize: (@options)->
3
+ Luca.containers.CardView::initialize.apply @, arguments
4
+
5
+ @defaultCard ||= @components[0]?.name
6
+
7
+ throw "Controllers must specify a defaultCard property and/or the first component must have a name" unless @defaultCard
8
+
9
+ @state = new Backbone.Model
10
+ active_section: @defaultCard
11
+
12
+
13
+ each: (fn)->
14
+ _( @components ).each (component)=>
15
+ fn.apply @, [component]
16
+
17
+ default: (callback)->
18
+ @navigate_to(@defaultCard, callback)
19
+
20
+ # switch the active card of this controller
21
+ # optionally passing an onActivation callback
22
+ # will fire this callback in the context of
23
+ # the currently active card
24
+ navigate_to: (section, callback)->
25
+ section ||= @defaultCard
26
+
27
+ # activate is a method on Luca.containers.CardView which
28
+ # selects a component and makes it visible, hiding any
29
+ # other component which may be monopolizing the view at that time.
30
+
31
+ # after activation it triggers a after:card:switch event
32
+ # and if it is the first time that view is being activated,
33
+ # it triggers a first:activation event which gets relayed to all
34
+ # child components in that view
35
+ @activate section, false, (activator, previous,current)=>
36
+ @state.set(active_section: current.name )
37
+ if _.isFunction( callback )
38
+ callback.apply(current)
39
+
40
+ # return the section we are navigating to
41
+ @find(section)
@@ -0,0 +1,40 @@
1
+ Luca.fields.ButtonField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ readOnly: true
5
+
6
+ events:
7
+ "click input" : "click_handler"
8
+
9
+ hooks:[
10
+ "button:click"
11
+ ]
12
+
13
+ className: 'luca-ui-field luca-ui-button-field'
14
+
15
+ template: 'fields/button_field'
16
+
17
+ click_handler: (e)->
18
+ me = my = $( e.currentTarget )
19
+ @trigger "button:click"
20
+
21
+ initialize: (@options={})->
22
+ _.extend @options
23
+ _.bindAll @, "click_handler"
24
+
25
+ Luca.core.Field::initialize.apply @, arguments
26
+
27
+ @template = "fields/button_field_link" if @icon_class?.length
28
+
29
+ afterInitialize: ()->
30
+ @input_id ||= _.uniqueId('button')
31
+ @input_name ||= @name ||= @input_id
32
+ @input_value ||= @label ||= @text
33
+ @input_type ||= "button"
34
+ @input_class ||= @class
35
+ @icon_class ||= ""
36
+ @icon_class = "icon-#{ @icon_class }" if @icon_class.length and !@icon_class.match(/^icon-/)
37
+
38
+ setValue: ()-> true
39
+
40
+ Luca.register "button_field", "Luca.fields.ButtonField"
@@ -0,0 +1,41 @@
1
+ Luca.fields.CheckboxField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ events:
5
+ "change input" : "change_handler"
6
+
7
+ change_handler: (e)->
8
+ me = my = $(e.currentTarget)
9
+
10
+ @trigger "on:change", @, e
11
+
12
+ if me.checked is true
13
+ @trigger "checked"
14
+ else
15
+ @trigger "unchecked"
16
+
17
+ className: 'luca-ui-checkbox-field luca-ui-field'
18
+
19
+ template: 'fields/checkbox_field'
20
+
21
+ hooks: ["checked","unchecked"]
22
+
23
+ initialize: (@options={})->
24
+ _.extend @, @options
25
+ _.bindAll @, "change_handler"
26
+
27
+ Luca.core.Field::initialize.apply @, arguments
28
+
29
+ afterInitialize: ()->
30
+ @input_id ||= _.uniqueId('field')
31
+ @input_name ||= @name
32
+ @input_value ||= 1
33
+ @label ||= @name
34
+
35
+ setValue: (checked)->
36
+ @input.attr('checked', checked)
37
+
38
+ getValue:()->
39
+ @input.attr('checked') is true
40
+
41
+ Luca.register "checkbox_field", "Luca.fields.CheckboxField"
@@ -0,0 +1,15 @@
1
+ Luca.fields.FileUploadField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ template: 'fields/file_upload_field'
5
+
6
+ initialize: (@options={})->
7
+ Luca.core.Field::initialize.apply @, arguments
8
+
9
+ afterInitialize: ()->
10
+ @input_id ||= _.uniqueId('field')
11
+ @input_name ||= @name
12
+ @label ||= @name
13
+ @helperText ||= ""
14
+
15
+ Luca.register "file_upload_field", "Luca.fields.FileUploadField"
@@ -0,0 +1,18 @@
1
+ Luca.fields.HiddenField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ template: 'fields/hidden_field'
5
+
6
+ initialize: (@options={})->
7
+ Luca.core.Field::initialize.apply @, arguments
8
+
9
+ afterInitialize: ()->
10
+ @input_id ||= _.uniqueId('field')
11
+ @input_name ||= @name
12
+ @input_value ||= @value
13
+ @label ||= @name
14
+
15
+ Luca.register "hidden_field", "Luca.fields.HiddenField"
16
+
17
+
18
+
@@ -0,0 +1,100 @@
1
+ Luca.fields.SelectField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ events:
5
+ "change select" : "change_handler"
6
+
7
+ hooks:[
8
+ "after:select"
9
+ ]
10
+
11
+ className: 'luca-ui-select-field luca-ui-field'
12
+
13
+ template: "fields/select_field"
14
+
15
+ includeBlank: true
16
+
17
+ blankValue: ''
18
+
19
+ blankText: 'Select One'
20
+
21
+ initialize: (@options={})->
22
+ _.extend @, @options
23
+ _.extend @, Luca.modules.Deferrable
24
+ _.bindAll @, "change_handler", "populateOptions", "beforeFetch"
25
+
26
+ Luca.core.Field::initialize.apply @, arguments
27
+
28
+ @input_id ||= _.uniqueId('field')
29
+ @input_name ||= @name
30
+ @label ||= @name
31
+ @retainValue = true if _.isUndefined @retainValue
32
+
33
+ afterInitialize: ()->
34
+ if @collection?.data
35
+ @valueField ||= "id"
36
+ @displayField ||= "name"
37
+ @parseData()
38
+
39
+ try
40
+ @configure_collection()
41
+ catch e
42
+ console.log "Error Configuring Collection", @, e.message
43
+
44
+ @collection.bind "before:fetch", @beforeFetch
45
+ @collection.bind "reset", @populateOptions
46
+
47
+ # if the select field is configured with a data property
48
+ # then parse that data into the proper format. either
49
+ # an array of objects with the valueField and displayField
50
+ # properties, or an array of arrays with [valueField, displayField]
51
+ parseData: ()->
52
+ @collection.data = _( @collection.data ).map (record)=>
53
+ return record if not _.isArray( record )
54
+ hash = {}
55
+ hash[ @valueField ] = record[0]
56
+ hash[ @displayField ] = record[1]
57
+
58
+ hash
59
+
60
+
61
+ afterRender: ()->
62
+ @input = $('select', @el)
63
+
64
+ if @collection?.models?.length > 0
65
+ @populateOptions()
66
+ else
67
+ @collection.trigger("reset")
68
+
69
+ setValue: (value)->
70
+ @currentValue = value
71
+ Luca.core.Field::setValue.apply @, arguments
72
+
73
+ beforeFetch: ()->
74
+ @resetOptions()
75
+
76
+ change_handler: (e)->
77
+ @trigger "on:change", @, e
78
+
79
+ resetOptions: ()->
80
+ @input.html('')
81
+
82
+ if @includeBlank
83
+ @input.append("<option value='#{ @blankValue }'>#{ @blankText }</option>")
84
+
85
+
86
+ populateOptions: ()->
87
+ @resetOptions()
88
+
89
+ if @collection?.each?
90
+ @collection.each (model) =>
91
+ value = model.get( @valueField )
92
+ display = model.get( @displayField )
93
+ selected = "selected" if @selected and value is @selected
94
+ option = "<option #{ selected } value='#{ value }'>#{ display }</option>"
95
+ @input.append( option )
96
+
97
+ @trigger "after:populate:options", @
98
+ @setValue( @currentValue )
99
+
100
+ Luca.register "select_field", "Luca.fields.SelectField"
@@ -0,0 +1,43 @@
1
+ Luca.fields.TextAreaField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ events:
5
+ "keydown input" : "keydown_handler"
6
+ "blur input" : "blur_handler"
7
+ "focus input" : "focus_handler"
8
+
9
+ template: 'fields/text_area_field'
10
+
11
+ height: "200px"
12
+ width: "90%"
13
+
14
+ initialize: (@options={})->
15
+ _.bindAll @, "keydown_handler"
16
+
17
+ Luca.core.Field::initialize.apply @, arguments
18
+
19
+ @input_id ||= _.uniqueId('field')
20
+ @input_name ||= @name
21
+ @label ||= @name
22
+ @input_class ||= @class
23
+ @inputStyles ||= "height:#{ @height };width:#{ @width }"
24
+
25
+ setValue: (value)->
26
+ $( @field() ).val(value)
27
+
28
+ getValue: ()->
29
+ $( @field() ).val()
30
+
31
+ field: ()->
32
+ @input = $("textarea##{ @input_id }", @el)
33
+
34
+ keydown_handler: (e)->
35
+ me = my = $( e.currentTarget )
36
+
37
+ blur_handler: (e)->
38
+ me = my = $( e.currentTarget )
39
+
40
+ focus_handler: (e)->
41
+ me = my = $( e.currentTarget )
42
+
43
+ Luca.register "text_area_field", "Luca.fields.TextAreaField"
@@ -0,0 +1,42 @@
1
+ Luca.fields.TextField = Luca.core.Field.extend
2
+ form_field: true
3
+
4
+ events:
5
+ "keydown input" : "keydown_handler"
6
+ "blur input" : "blur_handler"
7
+ "focus input" : "focus_handler"
8
+ "change input" : "change_handler"
9
+
10
+ template: 'fields/text_field'
11
+
12
+ initialize: (@options={})->
13
+ _.bindAll @, "keydown_handler", "blur_handler", "focus_handler"
14
+ Luca.core.Field::initialize.apply @, arguments
15
+
16
+ @input_id ||= _.uniqueId('field')
17
+ @input_name ||= @name
18
+ @label ||= @name
19
+
20
+ if @prepend
21
+ @$el.addClass('input-prepend')
22
+ @addOn = @prepend
23
+
24
+ if @append
25
+ @$el.addClass('input-append')
26
+ @addOn = @append
27
+
28
+ keydown_handler: _.throttle ((e)-> @change_handler.apply @, arguments), 300
29
+
30
+ blur_handler: (e)->
31
+ me = my = $( e.currentTarget )
32
+
33
+ focus_handler: (e)->
34
+ me = my = $( e.currentTarget )
35
+
36
+ change_handler: (e)->
37
+ @trigger "on:change", @, e
38
+
39
+
40
+ Luca.register "text_field", "Luca.fields.TextField"
41
+
42
+
@@ -0,0 +1,10 @@
1
+ Luca.fields.TypeAheadField = Luca.fields.TextField.extend
2
+ form_field: true
3
+
4
+ className: 'luca-ui-field'
5
+
6
+ afterInitialize: ()->
7
+ @input_id ||= _.uniqueId('field')
8
+ @input_name ||= @name
9
+ @label ||= @name
10
+
@@ -0,0 +1,26 @@
1
+ Luca.components.FormButtonToolbar = Luca.components.Toolbar.extend
2
+ className: 'luca-ui-form-toolbar form-actions'
3
+
4
+ position: 'bottom'
5
+
6
+ includeReset: false
7
+
8
+ render: ()->
9
+ $(@container).append(@el)
10
+
11
+ initialize: (@options={})->
12
+ Luca.components.Toolbar.prototype.initialize.apply @, arguments
13
+
14
+ @components = [
15
+ ctype: 'button_field'
16
+ label: 'Submit'
17
+ class: 'btn submit-button'
18
+ ]
19
+
20
+ if @includeReset
21
+ @components.push
22
+ ctype: 'button_field'
23
+ label: 'Reset'
24
+ class: 'btn reset-button'
25
+
26
+ Luca.register "form_button_toolbar", "Luca.components.FormButtonToolbar"