luca 0.9.2 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. data/.gitignore +1 -0
  2. data/.rvmrc +1 -1
  3. data/CHANGELOG +46 -2
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +2 -2
  6. data/Guardfile +1 -1
  7. data/README.md +64 -27
  8. data/ROADMAP +17 -2
  9. data/Rakefile +49 -1
  10. data/app.rb +38 -2
  11. data/assets/javascripts/luca-ui-base.coffee +1 -20
  12. data/assets/javascripts/luca-ui-full.js +3 -0
  13. data/assets/javascripts/luca-ui.coffee +0 -5
  14. data/assets/javascripts/sandbox/application.coffee +24 -18
  15. data/assets/javascripts/sandbox/router.coffee +16 -6
  16. data/assets/javascripts/sandbox/templates/builder/component_list.luca +1 -0
  17. data/assets/javascripts/sandbox/templates/builder.luca +2 -0
  18. data/assets/javascripts/sandbox/templates/main.luca +4 -3
  19. data/assets/javascripts/sandbox/templates/sandbox/docs_index.luca +1 -0
  20. data/assets/javascripts/sandbox/templates/sandbox/navigation.luca +6 -1
  21. data/assets/javascripts/sandbox/templates/sandbox/readme.luca +30 -0
  22. data/assets/javascripts/sandbox/views/builder/builder_canvas.coffee +3 -0
  23. data/assets/javascripts/sandbox/views/builder/builder_editor.coffee +6 -0
  24. data/assets/javascripts/sandbox/views/builder/component_list.coffee +38 -0
  25. data/assets/javascripts/sandbox/views/builder/project_browser.coffee +14 -0
  26. data/assets/javascripts/sandbox/views/builder.coffee +133 -0
  27. data/assets/javascripts/sandbox/views/docs_controller.coffee +7 -0
  28. data/assets/javascripts/sandbox/views/inspector/instance_filter.coffee +18 -0
  29. data/assets/javascripts/sandbox/{collections/sample.coffee → views/inspector/instance_list.coffee} +0 -0
  30. data/assets/javascripts/sandbox/views/inspector.coffee +11 -0
  31. data/assets/javascripts/sandbox.coffee +2 -0
  32. data/assets/stylesheets/luca-ui-full.css +3 -0
  33. data/assets/stylesheets/sandbox/builder.scss +79 -0
  34. data/assets/stylesheets/sandbox/sandbox.scss +2 -1
  35. data/docs/application.md +41 -0
  36. data/docs/collection.md +79 -0
  37. data/docs/collection_manager.md +76 -0
  38. data/docs/container_philosophy.md +122 -0
  39. data/docs/event_binding_helpers.md +164 -0
  40. data/docs/method_caching_and_computed_properties.md +77 -0
  41. data/docs/view.md +119 -0
  42. data/lib/luca/rails/version.rb +1 -1
  43. data/lib/luca/template.rb +9 -9
  44. data/site/assets/bootstrap.min.js +7 -0
  45. data/site/assets/luca-ui-bootstrap.css +19 -1
  46. data/site/assets/luca-ui-development-tools.css +10 -0
  47. data/site/assets/luca-ui-development-tools.min.js +15 -0
  48. data/site/assets/luca-ui-full.min.js +8 -0
  49. data/site/assets/luca-ui.min.js +4 -0
  50. data/site/assets/sandbox.css +52 -4
  51. data/site/assets/sandbox.js +368 -30
  52. data/site/docs/application.html +41 -0
  53. data/site/docs/caching.html +43 -0
  54. data/site/docs/collection.html +75 -0
  55. data/site/docs/collection_manager.html +71 -0
  56. data/site/docs/containers.html +118 -0
  57. data/site/docs/events.html +153 -0
  58. data/site/docs/view.html +128 -0
  59. data/site/img/glyphicons-halflings-white.png +0 -0
  60. data/site/img/glyphicons-halflings.png +0 -0
  61. data/site/source-map.js +1 -0
  62. data/spec/core/view_spec.coffee +5 -17
  63. data/spec/managers/collection_manager_spec.coffee +4 -7
  64. data/src/components/application.coffee +202 -77
  65. data/src/components/base_toolbar.coffee +1 -1
  66. data/src/components/collection_view.coffee +38 -10
  67. data/src/components/controller.coffee +24 -1
  68. data/src/components/fields/checkbox_field.coffee +9 -12
  69. data/src/components/fields/label_field.coffee +14 -0
  70. data/src/components/fields/select_field.coffee +2 -2
  71. data/src/components/fields/text_field.coffee +12 -7
  72. data/src/components/fields/type_ahead_field.coffee +1 -0
  73. data/src/components/form_view.coffee +44 -25
  74. data/src/components/page_controller.coffee +2 -0
  75. data/src/containers/card_view.coffee +4 -1
  76. data/src/containers/column_view.coffee +2 -1
  77. data/src/containers/modal_view.coffee +6 -2
  78. data/src/containers/page_view.coffee +2 -0
  79. data/src/containers/panel_toolbar.coffee +0 -5
  80. data/src/containers/viewport.coffee +28 -10
  81. data/src/core/collection.coffee +7 -1
  82. data/src/core/container.coffee +57 -30
  83. data/src/core/core.coffee +0 -186
  84. data/src/core/field.coffee +11 -3
  85. data/src/core/model.coffee +31 -16
  86. data/src/core/panel.coffee +6 -46
  87. data/src/core/registry.coffee +19 -2
  88. data/src/core/script_loader.coffee +32 -0
  89. data/src/core/view.coffee +112 -139
  90. data/src/define.coffee +110 -0
  91. data/src/framework.coffee +8 -2
  92. data/src/luca.coffee +22 -0
  93. data/src/managers/collection_manager.coffee +65 -31
  94. data/src/modules/load_mask.coffee +47 -0
  95. data/src/plugins/development_tool_helpers.coffee +21 -0
  96. data/src/plugins/events.coffee +54 -0
  97. data/src/stylesheets/components/viewport.scss +15 -0
  98. data/src/stylesheets/containers/container.scss +1 -4
  99. data/src/stylesheets/tools/component_tester.scss +18 -0
  100. data/src/templates/fields/select_field.luca +6 -5
  101. data/src/templates/fields/text_field.luca +10 -9
  102. data/src/tools/application_inspector.coffee +2 -0
  103. data/src/tools/coffee_script_editor.coffee +28 -6
  104. data/src/tools/collections/components.coffee +59 -0
  105. data/src/tools/collections/instances.coffee +15 -0
  106. data/src/tools/component_tester.coffee +12 -22
  107. data/src/tools/console.coffee +22 -4
  108. data/src/tools/models/components.coffee +16 -54
  109. data/src/tools/models/instance.coffee +2 -0
  110. data/src/{core/util.coffee → util.coffee} +10 -1
  111. data/vendor/assets/javascripts/luca-ui-base.js +132 -137
  112. data/vendor/assets/javascripts/luca-ui-development-tools.js +191 -219
  113. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +2 -2
  114. data/vendor/assets/javascripts/luca-ui-full.js +4680 -0
  115. data/vendor/assets/javascripts/luca-ui-full.min.js +8 -0
  116. data/vendor/assets/javascripts/luca-ui-spec.js +291 -225
  117. data/vendor/assets/javascripts/luca-ui.js +1001 -724
  118. data/vendor/assets/javascripts/luca-ui.min.js +4 -4
  119. data/vendor/assets/stylesheets/luca-ui-bootstrap.css +19 -1
  120. data/vendor/assets/stylesheets/luca-ui-development-tools.css +10 -0
  121. data/vendor/assets/stylesheets/luca-ui-full.css +1334 -0
  122. data/vendor/assets/stylesheets/luca-ui-spec.css +19 -1
  123. data/vendor/assets/stylesheets/luca-ui.css +19 -1
  124. data/views/index.erb +2 -5
  125. metadata +58 -9
  126. data/lib/sprockets/luca_template.rb +0 -49
  127. data/src/tools/class_browser.coffee +0 -39
  128. data/src/tools/components/class_browser_detail.coffee +0 -10
  129. data/src/tools/components/class_browser_list.coffee +0 -74
data/src/luca.coffee ADDED
@@ -0,0 +1,22 @@
1
+ #= require ./framework
2
+ #= require ./util
3
+ #= require_tree ./plugins
4
+ #= require ./define
5
+
6
+ #= require_tree ./templates
7
+ #= require_tree ./modules
8
+
9
+ #= require ./core/registry
10
+ #= require ./core/observer
11
+ #= require ./core/view
12
+ #= require ./core/model
13
+ #= require ./core/collection
14
+ #= require ./core/panel
15
+ #= require ./core/field
16
+ #= require ./core/container
17
+
18
+ #= require_tree ./managers
19
+
20
+ #= require ./containers/split_view
21
+ #= require ./containers/column_view
22
+ #= require_tree ./containers
@@ -1,8 +1,12 @@
1
1
  class Luca.CollectionManager
2
2
  name: "primary"
3
3
 
4
+ collectionNamespace: Luca.Collection.namespace
5
+
4
6
  __collections: {}
5
7
 
8
+ relayEvents: true
9
+
6
10
  constructor: (@options={})->
7
11
  _.extend @, @options
8
12
 
@@ -25,15 +29,7 @@ class Luca.CollectionManager
25
29
  @state = new Luca.Model()
26
30
 
27
31
  if @initialCollections
28
- @state.set({loaded_collections_count: 0, collections_count: @initialCollections.length })
29
- @state.bind "change:loaded_collections_count", @collectionCountDidChange
30
-
31
- if @useProgressLoader
32
- @loaderView ||= new Luca.components.CollectionLoaderView(manager: @,name:"collection_loader_view")
33
-
34
- @loadInitialCollections()
35
-
36
- @
32
+ handleInitialCollections.call(@)
37
33
 
38
34
  add: (key, collection)->
39
35
  @currentScope()[ key ] ||= collection
@@ -46,19 +42,21 @@ class Luca.CollectionManager
46
42
  # skip registering this collection
47
43
  create: (key, collectionOptions={}, initialModels=[])->
48
44
  CollectionClass = collectionOptions.base
49
- CollectionClass ||= @guessCollectionClass(key)
45
+ CollectionClass ||= guessCollectionClass.call(@, key)
50
46
  collectionOptions.name = "" if collectionOptions.private
51
47
 
52
48
  collection = new CollectionClass(initialModels,collectionOptions)
53
49
 
54
50
  @add(key, collection)
55
51
 
56
- return collection
52
+ collectionManager = @
57
53
 
54
+ if @relayEvents is true
55
+ @bind "*", ()->
56
+ console.log "Relay Events on Collection Manager *", collection, arguments
58
57
 
59
- collectionNamespace: Luca.Collection.namespace
58
+ return collection
60
59
 
61
-
62
60
  currentScope: ()->
63
61
  if current_scope = @getScope()
64
62
  @__collections[ current_scope ] ||= {}
@@ -73,28 +71,22 @@ class Luca.CollectionManager
73
71
 
74
72
  getScope: ()-> undefined
75
73
 
74
+ destroy: (key)->
75
+ c = @get(key)
76
+ delete @currentScope()[key]
77
+ c
78
+
76
79
  getOrCreate: (key,collectionOptions={},initialModels=[])->
77
80
  @get(key) || @create(key,collectionOptions,initialModels,false)
78
81
 
79
- guessCollectionClass: (key)->
80
- classified = Luca.util.classify( key )
81
- guess = (@collectionNamespace || (window || global) )[ classified ]
82
- guess ||= (@collectionNamespace || (window || global) )[ "#{classified}Collection" ]
83
- guess
84
-
85
- loadInitialCollections: ()->
86
- collectionDidLoad = (collection) =>
87
- collection.unbind "reset"
88
- @trigger "collection_loaded", collection.name
89
-
90
- _(@initialCollections).each (name) =>
91
- collection = @getOrCreate(name)
92
- collection.bind "reset", ()->
93
- collectionDidLoad(collection)
94
- collection.fetch()
95
-
96
82
  collectionCountDidChange: ()->
97
- @trigger "all_collections_loaded" if @totalCollectionsCount() == @loadedCollectionsCount()
83
+ if @allCollectionsLoaded()
84
+ # for backwards compat
85
+ @trigger "all_collections_loaded"
86
+ @trigger "initial:load"
87
+
88
+ allCollectionsLoaded:()->
89
+ @totalCollectionsCount() is @loadedCollectionsCount()
98
90
 
99
91
  totalCollectionsCount: ()->
100
92
  @state.get("collections_count")
@@ -107,3 +99,45 @@ class Luca.CollectionManager
107
99
 
108
100
  Luca.CollectionManager.destroyAll = ()->
109
101
  Luca.CollectionManager.instances = {}
102
+
103
+ guessCollectionClass = (key)->
104
+ classified = Luca.util.classify( key )
105
+ # support our naming convention of Books
106
+ guess = (@collectionNamespace || (window || global) )[ classified ]
107
+ # support naming covention like BooksCollection
108
+ guess ||= (@collectionNamespace || (window || global) )[ "#{classified}Collection" ]
109
+
110
+ if not guess? and Luca.Collection.namespaces?.length > 0
111
+ guesses = _( Luca.Collection.namespaces.reverse() ).map (namespace)->
112
+ Luca.util.resolve("#{ namespace }.#{ classified }") || Luca.util.resolve("#{ namespace }.#{ classified }Collection")
113
+
114
+ guesses = _( guesses ).compact()
115
+
116
+ guess = guesses[0] if guesses.length > 0
117
+
118
+ guess
119
+
120
+ loadInitialCollections = ()->
121
+ collectionDidLoad = (collection) =>
122
+ current = @state.get("loaded_collections_count")
123
+
124
+ @state.set("loaded_collections_count", current + 1)
125
+ @trigger "collection_loaded", collection.name
126
+ collection.unbind "reset"
127
+
128
+ _(@initialCollections).each (name) =>
129
+ collection = @getOrCreate(name)
130
+ collection.once "reset", ()->
131
+ collectionDidLoad(collection)
132
+ collection.fetch()
133
+
134
+ handleInitialCollections = ()->
135
+ @state.set({loaded_collections_count: 0, collections_count: @initialCollections.length })
136
+ @state.bind "change:loaded_collections_count", ()=> @collectionCountDidChange()
137
+
138
+ if @useProgressLoader
139
+ @loaderView ||= new Luca.components.CollectionLoaderView(manager: @,name:"collection_loader_view")
140
+
141
+ loadInitialCollections.call(@)
142
+
143
+ @
@@ -0,0 +1,47 @@
1
+ Luca.modules.LoadMaskable =
2
+ _included: (self, module)->
3
+ _.bindAll self, "applyLoadMask", "disableLoadMask"
4
+
5
+ if @loadMask is true
6
+ @defer ()=>
7
+ @$el.addClass('with-mask')
8
+
9
+ if @$('.load-mask').length is 0
10
+ @loadMaskTarget().prepend Luca.template(@loadMaskTemplate, @)
11
+ @$('.load-mask').hide()
12
+ .until("after:render")
13
+
14
+ @on (@loadmaskEnableEvent || "enable:loadmask"), @applyLoadMask
15
+ @on (@loadmaskDisableEvent || "disable:loadmask"), @applyLoadMask
16
+
17
+ loadMaskTarget: ()->
18
+ if @loadMaskEl? then @$(@loadMaskEl) else @$bodyEl()
19
+
20
+ disableLoadMask: ()->
21
+ @$('.load-mask .bar').css("width","100%")
22
+ @$('.load-mask').hide()
23
+ clearInterval(@loadMaskInterval)
24
+
25
+ enableLoadMask: ()->
26
+ @$('.load-mask').show().find('.bar').css("width","0%")
27
+ maxWidth = @$('.load-mask .progress').width()
28
+ if maxWidth < 20 and (maxWidth = @$el.width()) < 20
29
+ maxWidth = @$el.parent().width()
30
+
31
+ @loadMaskInterval = setInterval ()=>
32
+ currentWidth = @$('.load-mask .bar').width()
33
+ newWidth = currentWidth + 12
34
+ @$('.load-mask .bar').css('width', newWidth)
35
+ , 200
36
+
37
+ return unless @loadMaskTimeout?
38
+
39
+ _.delay ()=>
40
+ @disableLoadMask()
41
+ , @loadMaskTimeout
42
+
43
+ applyLoadMask: ()->
44
+ if @$('.load-mask').is(":visible")
45
+ @disableLoadMask()
46
+ else
47
+ @enableLoadMask()
@@ -0,0 +1,21 @@
1
+ Luca.DevelopmentToolHelpers =
2
+ refreshCode: ()->
3
+ view = @
4
+
5
+ _( @eventHandlerProperties() ).each (prop)->
6
+ view[ prop ] = view.definitionClass()[prop]
7
+
8
+ if @autoBindEventHandlers is true
9
+ @bindAllEventHandlers()
10
+
11
+ @delegateEvents()
12
+
13
+ eventHandlerProperties: ()->
14
+ handlerIds = _( @events ).values()
15
+ _( handlerIds ).select (v)->
16
+ _.isString(v)
17
+
18
+ eventHandlerFunctions: ()->
19
+ handlerIds = _( @events ).values()
20
+ _( handlerIds ).map (handlerId)=>
21
+ if _.isFunction(handlerId) then handlerId else @[handlerId]
@@ -0,0 +1,54 @@
1
+ # Luca.Events
2
+ #
3
+ # These helpers will get mixed into Luca.Collection, Luca.View, and Luca.Model.
4
+ #
5
+ # They allow for syntactic sugar like:
6
+ #
7
+ # view.defer("someMethodOnTheView").until("collection","fetch")
8
+ #
9
+ # or
10
+ #
11
+ # view.defer( myCallback ).until("triggered:event")
12
+ class DeferredBindingProxy
13
+ constructor: (@object, operation, wrapWithUnderscore=true)->
14
+ if _.isFunction(operation)
15
+ fn = operation
16
+
17
+ else if _.isString(operation) and _.isFunction(@object[operation])
18
+ fn = @object[operation]
19
+
20
+ unless _.isFunction(fn)
21
+ throw "Must pass a function or a string representing one"
22
+
23
+ if wrapWithUnderscore is true
24
+ @fn = ()=>
25
+ _.defer(fn)
26
+ else
27
+ @fn = fn
28
+
29
+ @
30
+
31
+ # until accepts an object to bind to, and a trigger to bind with
32
+ # if you just pass a trigger, the object getting bound to
33
+ # will implicitly be @object
34
+ until: (watch, trigger)->
35
+ if watch? and not trigger?
36
+ trigger = watch
37
+ watch = @object
38
+
39
+ watch.once(trigger, @fn)
40
+
41
+ @object
42
+
43
+ Luca.Events =
44
+ defer: (operation, wrapWithUnderscore=true)->
45
+ new DeferredBindingProxy(@, operation, wrapWithUnderscore)
46
+
47
+ once: (trigger, callback, context)->
48
+ context ||= @
49
+
50
+ onceFn = ()->
51
+ callback.apply(context, arguments)
52
+ @unbind(trigger, onceFn)
53
+
54
+ @bind trigger, onceFn
@@ -0,0 +1,15 @@
1
+ html.luca-ui-fullscreen, body.luca-ui-fullscreen {
2
+ height: 100%;
3
+ }
4
+
5
+ .luca-ui-fullscreen {
6
+ .fluid-viewport-wrapper {
7
+ padding-top:40px;
8
+ }
9
+ .luca-ui-viewport, .fullscreen-container {
10
+ min-height: 100%;
11
+ height: auto !important;
12
+ height: 100%;
13
+ }
14
+ }
15
+
@@ -1,12 +1,9 @@
1
- .luca-ui-container {
2
-
3
- }
1
+ .luca-ui-container {}
4
2
 
5
3
  .luca-ui-card {
6
4
  }
7
5
 
8
6
  .toolbar-container {
9
- overflow: hidden;
10
7
  clear: both;
11
8
  }
12
9
 
@@ -5,4 +5,22 @@ ul.typeahead.dropdown-menu {
5
5
  .font-large .CodeMirror {
6
6
  font-size: 18px;
7
7
  line-height: 1.7;
8
+ }
9
+
10
+
11
+ #component_tester {
12
+ #editor_container {
13
+ .toolbar-container.bottom {
14
+ margin: 0px;
15
+ .luca-ui-toolbar {
16
+ margin: 0px;
17
+ padding: 0px;
18
+ }
19
+ }
20
+ }
21
+ [data-luca-owner="component_detail"] {
22
+ max-height: 600px;
23
+ overflow: scroll;
24
+ min-height: 400px;
25
+ }
8
26
  }
@@ -1,7 +1,8 @@
1
1
  %label{:for=>"<%= input_id %>"}
2
2
  <%= label %>
3
- %select{:style=>"<%= inputStyles %>",:id=>"<%= input_id %>",:name=>"<%= input_name %>"}
4
- <% if(helperText) { %>
5
- %p.helper-text.help-block
6
- <%= helperText %>
7
- <% } %>
3
+ .controls
4
+ %select{:style=>"<%= inputStyles %>",:id=>"<%= input_id %>",:name=>"<%= input_name %>"}
5
+ <% if(helperText) { %>
6
+ %p.helper-text.help-block
7
+ <%= helperText %>
8
+ <% } %>
@@ -3,14 +3,15 @@
3
3
  <%= label %>
4
4
  <% } %>
5
5
 
6
- <% if( typeof(addOn) !== "undefined" ) { %>
7
- %span.add-on
8
- <%= addOn %>
9
- <% } %>
6
+ .controls
7
+ <% if( typeof(addOn) !== "undefined" ) { %>
8
+ %span.add-on
9
+ <%= addOn %>
10
+ <% } %>
10
11
 
11
- %input{:style=>"<%= inputStyles %>",:id=>"<%= input_id %>",:type=>"text",:name=>"<%= input_name %>",:placeholder=>"<%= placeHolder %>", :class=>"<%= input_class %>"}
12
+ %input{:style=>"<%= inputStyles %>",:id=>"<%= input_id %>",:type=>"text",:name=>"<%= input_name %>",:placeholder=>"<%= placeHolder %>", :class=>"<%= input_class %>"}
12
13
 
13
- <% if(helperText) { %>
14
- %p.helper-text.help-block
15
- <%= helperText %>
16
- <% } %>
14
+ <% if(helperText) { %>
15
+ %p.helper-text.help-block
16
+ <%= helperText %>
17
+ <% } %>
@@ -0,0 +1,2 @@
1
+ _.def("Luca.tools.ApplicationInspector").extends("Luca.core.Container").with
2
+ name: "application_inspector"
@@ -1,6 +1,8 @@
1
1
  _.def("Luca.tools.CoffeeEditor").extends("Luca.tools.CodeMirrorField").with
2
2
  name : "coffeescript_editor"
3
3
 
4
+ autoCompile: true
5
+
4
6
  compileOptions:
5
7
  bare: true
6
8
 
@@ -11,7 +13,7 @@ _.def("Luca.tools.CoffeeEditor").extends("Luca.tools.CodeMirrorField").with
11
13
  initialize: (@options)->
12
14
  Luca.tools.CodeMirrorField::initialize.apply(@, arguments)
13
15
 
14
- _.bindAll(@, "editorChange")
16
+ _.bindAll(@, "editorChange", "toggleSource")
15
17
 
16
18
  editor = @
17
19
 
@@ -30,6 +32,12 @@ _.def("Luca.tools.CoffeeEditor").extends("Luca.tools.CodeMirrorField").with
30
32
  @state.bind "change:javascript", (model)->
31
33
  editor.onJavascriptChange?.call(editor, model.get('javascript') )
32
34
 
35
+ @state.bind "change:currentMode", (model)->
36
+ if model.get('currentMode') is "javascript"
37
+ editor.setValue model.get('javascript')
38
+ else
39
+ editor.setValue model.get('coffeescript')
40
+
33
41
  compile: (code, callback)->
34
42
  response = {}
35
43
  code ||= @getValue()
@@ -48,13 +56,27 @@ _.def("Luca.tools.CoffeeEditor").extends("Luca.tools.CodeMirrorField").with
48
56
  compiled: ''
49
57
  message: error.message
50
58
 
59
+ toggleMode: ()->
60
+ if @currentMode() is "coffeescript"
61
+ @state.set('currentMode', 'javascript')
62
+ else if @currentMode() is "javascript"
63
+ @state.set('currentMode', 'coffeescript')
64
+
51
65
  currentMode: ()->
52
66
  @state.get("currentMode")
53
67
 
54
- fixTabs: ()->
55
- value = @getValue(false)
56
- debugger
68
+ getCoffeescript: ()->
69
+ @state.get("coffeescript")
70
+
71
+ getJavascript: (recompile=false)->
72
+ js = @state.get("javascript")
73
+
74
+ if recompile is true or js?.length is 0
75
+ results = @compile( @getCoffeescript() )
76
+ js = results?.compiled
77
+
78
+ js
57
79
 
58
80
  editorChange: ()->
59
- @fixTabs()
60
- @state.set( @currentMode(), @getValue() )
81
+ if @autoCompile is true
82
+ @state.set( @currentMode(), @getValue() )
@@ -0,0 +1,59 @@
1
+ _.def('Luca.app.Components').extends('Luca.Collection').with
2
+
3
+ cachedMethods: [
4
+ "namespaces"
5
+ "classes"
6
+ "roots"
7
+ "views"
8
+ "collections"
9
+ "models"
10
+ ]
11
+
12
+ cache_key: "luca_components"
13
+
14
+ name: "components"
15
+
16
+ initialize: ()->
17
+ @model = Luca.app.Component
18
+ Luca.Collection::initialize.apply(@, arguments)
19
+
20
+ url: ()->
21
+ "/luca/source-map.js"
22
+
23
+ collections: ()->
24
+ @select (component)-> Luca.isCollectionPrototype( component.definition() )
25
+
26
+ modelClasses: ()->
27
+ @select (component)-> Luca.isModelPrototype( component.definition() )
28
+
29
+ views: ()->
30
+ @select (component)-> Luca.isViewPrototype( component.definition() )
31
+
32
+ classes: ()->
33
+ _.uniq( @pluck("className") )
34
+
35
+ roots: ()->
36
+ _.uniq( @invoke("root") )
37
+
38
+ namespaces: ()->
39
+ _.uniq( @invoke("namespace") )
40
+
41
+ asTree: ()->
42
+ classes = @classes()
43
+ namespaces = @namespaces()
44
+ roots = @roots()
45
+
46
+ tree = _( roots ).inject (memo,root)->
47
+ memo[ root ] ||= {}
48
+ regexp = new RegExp("^#{ root }")
49
+ memo[root] = _( namespaces ).select (namespace)->
50
+ regexp.exec(namespace) and _( namespaces ).include(namespace) and namespace.split('.').length is 2
51
+ memo
52
+ , {}
53
+
54
+ _( tree ).inject (memo, namespaces, root)->
55
+ memo[root] = {}
56
+ _( namespaces ).each (namespace)->
57
+ memo[root][namespace] = {}
58
+ memo
59
+ , {}
@@ -0,0 +1,15 @@
1
+ _.def("Luca.app.Instances").extends("Luca.Collection").with
2
+ name:"instances"
3
+ refresh:(options={})->
4
+ models = _( Luca.registry.instances() ).map (instance)->
5
+ cid: instance.cid
6
+ name: instance.name
7
+ ctype: instance.ctype
8
+ displayName: instance.displayName || instance::displayName
9
+ object: instance
10
+
11
+ @reset(models, options)
12
+
13
+ initialize:(initialModels=[],@options={})->
14
+ @model = Luca.app.Instance
15
+ Luca.Collection::initialize.apply(@,arguments)
@@ -95,12 +95,21 @@ ComponentPicker = Luca.fields.TypeAheadField.extend
95
95
 
96
96
 
97
97
  _.def("Luca.tools.ComponentTester").extends("Luca.core.Container").with
98
+ id: "component_tester"
98
99
  name: "component_tester"
99
100
 
100
- className:"span11"
101
-
102
101
  autoEvaluateCode: true
103
102
 
103
+ currentSize: 1
104
+
105
+ sizes:[
106
+ icon: "resize-full"
107
+ value: ()-> $(window).height() * 0.3
108
+ ,
109
+ icon: "resize-small"
110
+ value: ()-> $(window).height() * 0.6
111
+ ]
112
+
104
113
  components:[
105
114
  ctype: 'card_view'
106
115
  name: "component_detail"
@@ -116,11 +125,6 @@ _.def("Luca.tools.ComponentTester").extends("Luca.core.Container").with
116
125
  className: 'font-large fixed-height'
117
126
  minHeight:'350px'
118
127
 
119
- styles:
120
- "position" : "absolute"
121
- "bottom" : "0px"
122
- "width" : "96%"
123
-
124
128
  currentBuffers: defaults
125
129
 
126
130
  compiledBuffers:["component","setup","implementation"]
@@ -241,13 +245,6 @@ _.def("Luca.tools.ComponentTester").extends("Luca.core.Container").with
241
245
  @defer("editComponent").until("after:render")
242
246
 
243
247
  afterRender: ()->
244
- @getOutput().applyStyles('min-height':'400px')
245
-
246
- # TEMP
247
- # Visual hacks
248
- @$('.toolbar-container').css('padding-right','12px')
249
- @$('.luca-ui-toolbar.toolbar-bottom').css('margin','0px')
250
-
251
248
  changeHandler = _.idleMedium ()=>
252
249
  if @autoEvaluateCode is true
253
250
  @applyTestRun()
@@ -330,14 +327,7 @@ _.def("Luca.tools.ComponentTester").extends("Luca.core.Container").with
330
327
  @editBuffer @currentBufferName, (newMode is "javascript")
331
328
 
332
329
 
333
- currentSize: 1
334
- sizes:[
335
- icon: "resize-full"
336
- value: ()-> $(window).height() * 0.3
337
- ,
338
- icon: "resize-small"
339
- value: ()-> $(window).height() * 0.6
340
- ]
330
+
341
331
 
342
332
  toggleSize: (button)->
343
333
  index = @currentSize++ % @sizes.length
@@ -20,12 +20,11 @@ Luca.define("Luca.tools.DevelopmentConsole").extends("Luca.core.Container").with
20
20
 
21
21
  components:[
22
22
  ctype: "code_mirror_field"
23
+ additionalClassNames: "clearfix"
23
24
  name: "code_output"
24
25
  readOnly: true
25
26
  lineNumbers: false
26
27
  mode: "javascript"
27
- height:"621px"
28
- maxHeight:"621px"
29
28
  lineWrapping: true
30
29
  gutter: false
31
30
  ,
@@ -56,8 +55,13 @@ Luca.define("Luca.tools.DevelopmentConsole").extends("Luca.core.Container").with
56
55
  @$('input').focus()
57
56
  ]
58
57
 
58
+ afterRender: ()->
59
+ @$container().modal(backdrop: false)
60
+ @$container.css
61
+
59
62
  show: (options={})->
60
- @$el.addClass('modal').modal(options)
63
+ @$container().modal('show')
64
+ @
61
65
 
62
66
  getContext: ()->
63
67
  window
@@ -147,4 +151,18 @@ Luca.define("Luca.tools.DevelopmentConsole").extends("Luca.core.Container").with
147
151
  compile = _.bind(Luca.tools.CoffeeEditor::compile, @)
148
152
  raw = Luca("code_input").getValue()
149
153
  compiled = compile raw, (compiled)->
150
- dev.evaluateCode(compiled, raw)
154
+ dev.evaluateCode(compiled, raw)
155
+
156
+ Luca.util.launchers ||= {}
157
+
158
+ Luca.util.launchers.developmentConsole = (name="luca-development-console")->
159
+ @_lucaDevConsole = Luca name, ()=>
160
+ @$el.append Backbone.View::make("div", id: "#{ name }-wrapper", class: "modal fade")
161
+
162
+ console = new Luca.tools.DevelopmentConsole
163
+ name: name
164
+ container: "##{ name }-wrapper"
165
+
166
+ console.render()
167
+
168
+ @_lucaDevConsole.show()