luca 0.9.6 → 0.9.7

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 (76) hide show
  1. data/CHANGELOG +37 -14
  2. data/lib/luca/rails/version.rb +1 -1
  3. data/spec/components/collection_view_spec.coffee +24 -2
  4. data/spec/components/pagination_control_spec.coffee +0 -0
  5. data/spec/concerns/dom_helpers_spec.coffee +16 -0
  6. data/spec/concerns/filterable_spec.coffee +25 -0
  7. data/spec/concerns/model_presenter_spec.coffee +31 -0
  8. data/spec/concerns/paginatable_spec.coffee +0 -0
  9. data/spec/concerns/state_model_spec.coffee +0 -0
  10. data/spec/concerns_spec.coffee +88 -0
  11. data/spec/core/container_spec.coffee +74 -12
  12. data/spec/core/model_spec.coffee +6 -1
  13. data/spec/define_spec.coffee +0 -6
  14. data/spec/util_spec.coffee +24 -0
  15. data/src/components/application.coffee +32 -30
  16. data/src/components/base_toolbar.coffee +6 -4
  17. data/src/components/collection_loader_view.coffee +3 -1
  18. data/src/components/collection_view.coffee +42 -21
  19. data/src/components/controller.coffee +3 -1
  20. data/src/components/fields/button_field.coffee +19 -12
  21. data/src/components/fields/checkbox_array.coffee +8 -2
  22. data/src/components/fields/checkbox_field.coffee +18 -9
  23. data/src/components/fields/file_upload_field.coffee +5 -1
  24. data/src/components/fields/hidden_field.coffee +3 -1
  25. data/src/components/fields/label_field.coffee +4 -3
  26. data/src/components/fields/select_field.coffee +7 -8
  27. data/src/components/fields/text_field.coffee +3 -1
  28. data/src/components/fields/type_ahead_field.coffee +4 -2
  29. data/src/components/form_button_toolbar.coffee +4 -1
  30. data/src/components/form_view.coffee +49 -44
  31. data/src/components/grid_view.coffee +1 -1
  32. data/src/components/multi_collection_view.coffee +49 -22
  33. data/src/components/pagination_control.coffee +17 -13
  34. data/src/{modules → concerns}/application_event_bindings.coffee +1 -1
  35. data/src/{modules → concerns}/collection_event_bindings.coffee +1 -1
  36. data/src/{modules → concerns}/deferrable.coffee +1 -1
  37. data/src/{modules → concerns}/dom_helpers.coffee +11 -2
  38. data/src/{modules → concerns}/enhanced_properties.coffee +1 -1
  39. data/src/concerns/filterable.coffee +82 -0
  40. data/src/{modules → concerns}/grid_layout.coffee +1 -1
  41. data/src/{modules → concerns}/loadmaskable.coffee +1 -1
  42. data/src/{modules → concerns}/local_storage.coffee +0 -0
  43. data/src/{modules → concerns}/modal_view.coffee +1 -1
  44. data/src/concerns/model_presenter.coffee +23 -0
  45. data/src/concerns/paginatable.coffee +87 -0
  46. data/src/{modules → concerns}/state_model.coffee +1 -1
  47. data/src/{modules → concerns}/templating.coffee +1 -1
  48. data/src/concerns.coffee +70 -0
  49. data/src/containers/tab_view.coffee +7 -10
  50. data/src/core/collection.coffee +17 -1
  51. data/src/core/container.coffee +56 -31
  52. data/src/core/field.coffee +39 -38
  53. data/src/core/meta_data.coffee +37 -0
  54. data/src/core/model.coffee +18 -1
  55. data/src/core/view.coffee +25 -29
  56. data/src/define.coffee +54 -66
  57. data/src/framework.coffee +23 -18
  58. data/src/index.coffee +3 -1
  59. data/src/stylesheets/components/checkbox_array.scss +1 -1
  60. data/src/stylesheets/components/form_view.scss +5 -5
  61. data/src/stylesheets/components/viewport.scss +2 -1
  62. data/src/stylesheets/containers/container.scss +0 -5
  63. data/src/stylesheets/containers/tab_view.scss +5 -5
  64. data/src/tools/console.coffee +5 -5
  65. data/src/util.coffee +47 -0
  66. data/vendor/assets/javascripts/luca-ui-development-tools.js +5 -5
  67. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +1 -1
  68. data/vendor/assets/javascripts/luca-ui-full.js +905 -416
  69. data/vendor/assets/javascripts/luca-ui-full.min.js +5 -5
  70. data/vendor/assets/javascripts/luca-ui.js +905 -416
  71. data/vendor/assets/javascripts/luca-ui.min.js +5 -4
  72. data/vendor/assets/stylesheets/luca-ui.css +15 -15
  73. metadata +27 -17
  74. data/spec/mixin_spec.coffee +0 -49
  75. data/src/modules/filterable.coffee +0 -60
  76. data/src/modules/paginatable.coffee +0 -79
data/src/define.coffee CHANGED
@@ -13,6 +13,7 @@
13
13
  # _.def("MyView").extends("Luca.View").with the_custom:"shit"
14
14
  _.mixin
15
15
  def: Luca.component = Luca.define = Luca.register = (componentName)-> new DefineProxy(componentName)
16
+ register: Luca.register
16
17
 
17
18
  # The define proxy chain sets up a call to Luca.extend, which is a wrapper around Luca and Backbone component class' extend function.
18
19
  class DefineProxy
@@ -20,6 +21,7 @@ class DefineProxy
20
21
  @namespace = Luca.util.namespace()
21
22
  @componentId = @componentName = componentName
22
23
  @superClassName = 'Luca.View'
24
+ @properties ||= {}
23
25
 
24
26
  if componentName.match(/\./)
25
27
  @namespaced = true
@@ -30,6 +32,14 @@ class DefineProxy
30
32
  # automatically add the namespace to the namespace registry
31
33
  Luca.registry.addNamespace( parts.join('.') )
32
34
 
35
+ meta: (key, value)->
36
+ metaKey = @namespace + '.' + @componentId
37
+ metaKey = metaKey.replace(/^\./,'')
38
+ data = Luca.registry.addMetaData(metaKey, key, value)
39
+
40
+ @properties.componentMetaData = ()->
41
+ Luca.registry.getMetaDataFor(metaKey)
42
+
33
43
  # allow for specifying the namespace
34
44
  in: (@namespace)-> @
35
45
 
@@ -43,6 +53,7 @@ class DefineProxy
43
53
  for hook in hooks
44
54
  @properties.hooks.push(hook)
45
55
  @properties.hooks = _.uniq(@properties.hooks)
56
+ @meta("hooks", @properties.hooks)
46
57
  @
47
58
 
48
59
  includes: (includes...)->
@@ -50,16 +61,35 @@ class DefineProxy
50
61
  for include in includes
51
62
  @properties.include.push(include)
52
63
  @properties.include = _.uniq(@properties.include)
64
+ @meta("includes", @properties.include)
53
65
  @
54
66
 
55
- mixesIn: (mixins...)->
56
- _.defaults(@properties ||= {}, mixins: [])
57
- for mixin in mixins
58
- @properties.mixins.push(mixin)
59
- @properties.mixins = _.uniq(@properties.mixins)
67
+ mixesIn: (concerns...)->
68
+ _.defaults(@properties ||= {}, concerns: [])
69
+ for concern in concerns
70
+ @properties.concerns.push(concern)
71
+ @properties.concerns = _.uniq(@properties.concerns)
72
+
73
+ @meta("concerns", @properties.concerns)
60
74
  @
61
75
 
62
- defaultProperties: (properties={})->
76
+ publicConfiguration: (properties={})->
77
+ @meta("public configuration", _.keys(properties) )
78
+ _.defaults((@properties||={}), properties)
79
+
80
+ privateConfiguration: (properties={})->
81
+ @meta("private configuration", _.keys(properties) )
82
+ _.defaults((@properties||={}), properties)
83
+
84
+ publicInterface: (properties={})->
85
+ @meta("public interface", _.keys(properties) )
86
+ _.defaults((@properties||={}), properties)
87
+
88
+ privateInterface: (properties={})->
89
+ @meta("private interface", _.keys(properties) )
90
+ _.defaults((@properties||={}), properties)
91
+
92
+ definePrototype: (properties={})->
63
93
  _.defaults((@properties||={}), properties)
64
94
 
65
95
  at = if @namespaced
@@ -72,29 +102,37 @@ class DefineProxy
72
102
  eval("(window||global).#{ @namespace } = {}")
73
103
  at = Luca.util.resolve(@namespace,(window || global))
74
104
 
75
- at[@componentId] = Luca.extend(@superClassName,@componentName, @properties)
105
+ @meta("super class name", @superClassName )
106
+ @meta("display name", @componentName)
107
+
108
+ @properties.displayName = @componentName
109
+
110
+ @properties.componentMetaData = ()->
111
+ Luca.registry.getMetaDataFor(@displayName)
112
+
113
+ definition = at[@componentId] = Luca.extend(@superClassName,@componentName, @properties)
76
114
 
77
- if Luca.autoRegister is true
78
- componentType = "view" if Luca.isViewPrototype( at[@componentId] )
115
+ if Luca.config.autoRegister is true
116
+ componentType = "view" if Luca.isViewPrototype( definition )
79
117
 
80
- if Luca.isCollectionPrototype( at[@componentId] )
118
+ if Luca.isCollectionPrototype( definition )
81
119
  Luca.Collection.namespaces ||= []
82
120
  Luca.Collection.namespaces.push( @namespace )
83
121
  componentType = "collection"
84
122
 
85
- componentType = "model" if Luca.isModelPrototype( at[@componentId] )
123
+ componentType = "model" if Luca.isModelPrototype( definition )
86
124
 
87
125
  # automatically register this with the component registry
88
126
  Luca.registerComponent( _.string.underscored(@componentId), @componentName, componentType)
89
127
 
90
- at[@componentId]
128
+ definition
91
129
 
92
130
  # Aliases for the mixin definition
93
- DefineProxy::behavesAs = DefineProxy::uses = DefineProxy::mixesIn
131
+ DefineProxy::concerns = DefineProxy::behavesAs = DefineProxy::uses = DefineProxy::mixesIn
94
132
 
95
133
  # Aliases for the final call on the define proxy
96
- DefineProxy::defines = DefineProxy::defaults = DefineProxy::exports = DefineProxy::defaultProperties
97
- DefineProxy::defaultsTo = DefineProxy::enhance = DefineProxy::with = DefineProxy::defaultProperties
134
+ DefineProxy::defines = DefineProxy::defaults = DefineProxy::exports = DefineProxy::defaultProperties = DefineProxy::definePrototype
135
+ DefineProxy::defaultsTo = DefineProxy::enhance = DefineProxy::with = DefineProxy::definePrototype
98
136
 
99
137
  # The last method of the DefineProxy chain is always going to result in
100
138
  # a call to Luca.extend. Luca.extend wraps the call to Luca.View.extend,
@@ -105,8 +143,6 @@ DefineProxy::defaultsTo = DefineProxy::enhance = DefineProxy::with = DefineProxy
105
143
  Luca.extend = (superClassName, childName, properties={})->
106
144
  superClass = Luca.util.resolve( superClassName, (window || global) )
107
145
 
108
- superClass.__initializers ||= []
109
-
110
146
  unless _.isFunction(superClass?.extend)
111
147
  throw "Error defining #{ childName }. #{ superClassName } is not a valid component to extend from"
112
148
 
@@ -117,9 +153,8 @@ Luca.extend = (superClassName, childName, properties={})->
117
153
  superClass
118
154
 
119
155
  properties._super = (method, context=@, args=[])->
120
- # protect against a stack too deep error in weird cases
121
156
  # TODO: debug this better
122
-
157
+ # protect against a stack too deep error in weird cases
123
158
  @_superClass().prototype[method]?.apply(context, args)
124
159
 
125
160
  definition = superClass.extend(properties)
@@ -133,50 +168,3 @@ Luca.extend = (superClassName, childName, properties={})->
133
168
 
134
169
  definition
135
170
 
136
-
137
- Luca.mixin = (mixinName)->
138
- namespace = _( Luca.mixin.namespaces ).detect (space)->
139
- Luca.util.resolve(space)?[ mixinName ]?
140
-
141
- namespace ||= "Luca.modules"
142
-
143
- resolved = Luca.util.resolve(namespace)[ mixinName ]
144
-
145
- console.log "Could not find #{ mixinName } in ", Luca.mixin.namespaces unless resolved?
146
-
147
- resolved
148
-
149
- Luca.mixin.namespaces = [
150
- "Luca.modules"
151
- ]
152
-
153
- Luca.mixin.namespace = (namespace)->
154
- Luca.mixin.namespaces.push(namespace)
155
- Luca.mixin.namespaces = _( Luca.mixin.namespaces ).uniq()
156
-
157
- # Luca.decorate('Luca.View').with('Luca.modules.MyCustomMixin')
158
- Luca.decorate = (componentPrototype)->
159
- componentPrototype = Luca.util.resolve(componentPrototype).prototype if _.isString(componentPrototype)
160
-
161
- return with: (mixin)->
162
- mixinDefinition = Luca.mixin(mixin)
163
-
164
- mixinPrivates = _( mixinDefinition ).chain().keys().select (key)->
165
- "#{ key }".match(/^__/)
166
-
167
- sanitized = _( mixinDefinition ).omit( mixinPrivates.value() )
168
-
169
- _.extend(componentPrototype, sanitized)
170
-
171
- # When a mixin is included, we may want to do things
172
- mixinDefinition?.__included?.call(mixinDefinition, mixin)
173
-
174
- superclassMixins = componentPrototype._superClass()::mixins
175
-
176
- componentPrototype.mixins ||= []
177
- componentPrototype.mixins.push( mixin )
178
- componentPrototype.mixins = componentPrototype.mixins.concat( superclassMixins )
179
-
180
- componentPrototype.mixins = _( componentPrototype.mixins ).chain().uniq().compact().value()
181
-
182
- componentPrototype
data/src/framework.coffee CHANGED
@@ -19,11 +19,13 @@
19
19
  return fallback()
20
20
 
21
21
  _.extend Luca,
22
- VERSION: "0.9.6"
22
+ VERSION: "0.9.7"
23
23
  core: {}
24
+ collections: {}
24
25
  containers: {}
25
26
  components: {}
26
- modules: {}
27
+ models: {}
28
+ concerns: {}
27
29
  util: {}
28
30
  fields: {}
29
31
  registry:{}
@@ -33,6 +35,10 @@ _.extend Luca,
33
35
  # for triggering / binding to component definitions
34
36
  _.extend Luca, Backbone.Events
35
37
 
38
+ Luca.config.maintainStyleHierarchy = true
39
+ Luca.config.maintainClassHierarchy = true
40
+ Luca.config.autoApplyClassHierarchyAsCssClasses = true
41
+
36
42
  # When using Luca.define() should we automatically register
37
43
  # the component with the registry?
38
44
  Luca.autoRegister = Luca.config.autoRegister = true
@@ -106,34 +112,30 @@ Luca.isCollectionPrototype = (obj)->
106
112
  obj? and obj::? and !Luca.isModelPrototype(obj) and obj::reset? and obj::select? and obj::reject?
107
113
 
108
114
  Luca.inheritanceChain = (obj)->
109
- _( Luca.parentClasses(obj) ).map (className)-> Luca.util.resolve(className)
110
-
115
+ Luca.parentClasses(obj)
116
+
111
117
  Luca.parentClasses = (obj)->
112
118
  list = []
113
119
 
114
120
  if _.isString(obj)
115
121
  obj = Luca.util.resolve(obj)
116
122
 
117
- list.push( obj.displayName || obj::?.displayName || Luca.parentClass(obj) )
118
-
119
- classes = until not Luca.parentClass(obj)?
120
- obj = Luca.parentClass(obj)
121
-
122
- list = list.concat(classes)
123
+ metaData = obj.componentMetaData?()
124
+ metaData ||= obj::componentMetaData?()
123
125
 
124
- _.uniq list
125
-
126
- Luca.parentClass = (obj)->
127
- list = []
126
+ list = metaData?.classHierarchy() || [obj.displayName || obj::displayName]
128
127
 
128
+ Luca.parentClass = (obj, resolve=true)->
129
129
  if _.isString( obj )
130
130
  obj = Luca.util.resolve(obj)
131
131
 
132
- if Luca.isComponent(obj)
133
- obj.displayName
132
+ parent = obj.componentMetaData?()?.meta["super class name"]
133
+ parent ||= obj::componentMetaData?()?.meta["super class name"]
134
+
135
+ parent || obj.displayName || obj.prototype?.displayName
136
+
137
+ if resolve then Luca.util.resolve(parent) else parent
134
138
 
135
- else if Luca.isComponentPrototype(obj)
136
- obj::_superClass?()?.displayName
137
139
 
138
140
  # This is a convenience method for accessing the templates
139
141
  # available to the client side app, either the ones which ship with Luca
@@ -191,6 +193,9 @@ UnderscoreExtensions =
191
193
  # this function will ensure a function gets called at least once
192
194
  # afrer x delay. by setting defaults, we can use this on backbone
193
195
  # view definitions
196
+ #
197
+ # Note: I am not sure if this is the same as _.debounce or not. I will need
198
+ # to look into it
194
199
  idle: (code, delay=1000)->
195
200
  delay = 0 if window.DISABLE_IDLE
196
201
  handle = undefined
data/src/index.coffee CHANGED
@@ -1,10 +1,12 @@
1
1
  #= require ./util
2
2
  #= require_tree ./plugins
3
+ #= require ./concerns
3
4
  #= require ./define
4
5
 
5
- #= require_tree ./modules
6
+ #= require_tree ./concerns
6
7
 
7
8
  #= require ./core/registry
9
+ #= require ./core/meta_data
8
10
  #= require ./core/observer
9
11
  #= require ./core/view
10
12
  #= require ./core/model
@@ -1,4 +1,4 @@
1
- .luca-ui-checkbox-array {
1
+ .luca-ui-checkbox-array, .luca-checkbox-array {
2
2
  input.array-checkbox {
3
3
  display: inline-block;
4
4
  }
@@ -1,4 +1,4 @@
1
- .luca-ui-form-view-wrapper {
1
+ .luca-form-view {
2
2
  width: 100%;
3
3
  float: left;
4
4
  display: block;
@@ -7,7 +7,7 @@
7
7
  }
8
8
 
9
9
 
10
- .luca-ui-form-view {
10
+ .luca-form-view {
11
11
  .luca-ui-field {
12
12
  margin: 5px;
13
13
  padding: 5px;
@@ -19,7 +19,7 @@
19
19
  }
20
20
  }
21
21
 
22
- .luca-ui-form-view.label-align-top {
22
+ .luca-form-view.label-align-top {
23
23
  .luca-ui-field {
24
24
  label, input, select, textarea {
25
25
  margin: 5px 0px;
@@ -28,13 +28,13 @@
28
28
  }
29
29
  }
30
30
 
31
- .luca-ui-form-view.column-layout {
31
+ .luca-form-view.column-layout {
32
32
  .luca-ui-field {
33
33
  float: left;
34
34
  }
35
35
  }
36
36
 
37
- .luca-ui-form-view {
37
+ .luca-form-view {
38
38
  .toolbar-container {
39
39
  padding-right: 12px;
40
40
  }
@@ -6,7 +6,8 @@ html.luca-ui-fullscreen, body.luca-ui-fullscreen {
6
6
  .fluid-viewport-wrapper {
7
7
  padding-top:40px;
8
8
  }
9
- .luca-ui-viewport, .fullscreen-container {
9
+
10
+ .luca-viewport, .luca-ui-viewport, .fullscreen-container {
10
11
  min-height: 100%;
11
12
  height: auto !important;
12
13
  height: 100%;
@@ -1,8 +1,3 @@
1
- .luca-ui-container {}
2
-
3
- .luca-ui-card {
4
- }
5
-
6
1
  .toolbar-container {
7
2
  clear: both;
8
3
  }
@@ -1,19 +1,19 @@
1
- .luca-ui-tab-view {
1
+ .luca-tab-view {
2
2
  .luca-ui-card {
3
- .luca-ui-grid-view, .luca-ui-form-view, .luca-ui-card {
3
+ .luca-ui-grid-view, .luca-form-view, .luca-ui-card {
4
4
  overflow: hidden;
5
5
  }
6
6
  }
7
7
  }
8
8
 
9
- .luca-ui-tab-view.tabs-below, .luca-ui-tab-view.tabs-right {
9
+ .luca-tab-view.tabs-below, .luca-tab-view.tabs-right {
10
10
  .tab-selector-container {
11
11
  display: block;
12
12
  clear: both;
13
13
  }
14
14
  }
15
15
 
16
- .luca-ui-tab-view.tabs-left {
16
+ .luca-tab-view.tabs-left {
17
17
  .tab-selector-container {
18
18
  ul.nav-tabs {
19
19
  padding: 0px;
@@ -26,7 +26,7 @@
26
26
  }
27
27
  }
28
28
 
29
- .luca-ui-tab-view.tabs-right {
29
+ .luca-tab-view.tabs-right {
30
30
  .tab-selector-container {
31
31
  float: right;
32
32
  }
@@ -10,16 +10,16 @@ developmentConsole.defines
10
10
  width: 1000
11
11
 
12
12
  componentEvents:
13
- "code_input key:keyup" : "historyUp"
14
- "code_input key:keydown" : "historyDown"
15
- "code_input key:enter" : "runCommand"
13
+ "input key:keyup" : "historyUp"
14
+ "input key:keydown" : "historyDown"
15
+ "input key:enter" : "runCommand"
16
16
 
17
17
  compileOptions:
18
18
  bare: true
19
19
 
20
20
  components:[
21
21
  type: "code_mirror_field"
22
- getter: "getCodeMirror"
22
+ role: "code_mirror"
23
23
  additionalClassNames: "clearfix"
24
24
  name: "code_output"
25
25
  readOnly: true
@@ -30,7 +30,7 @@ developmentConsole.defines
30
30
  ,
31
31
  type: "text_field"
32
32
  name: "code_input"
33
- getter: "getInput"
33
+ role: "input"
34
34
  lineNumbers: false
35
35
  height: '30px'
36
36
  maxHeight: '30px'
data/src/util.coffee CHANGED
@@ -36,6 +36,16 @@ Luca.util.hook = (eventId="")->
36
36
  parts = _( parts ).map (p)-> _.string.capitalize(p)
37
37
  fn = prefix + parts.join('')
38
38
 
39
+ Luca.util.toCssClass = (componentName, exclusions...)->
40
+ parts = componentName.split('.')
41
+
42
+ transformed = for part in parts when _( exclusions ).indexOf(part) is -1
43
+ part = _.str.underscored(part)
44
+ part = part.replace(/_/g,'-')
45
+ part
46
+
47
+ transformed.join '-'
48
+
39
49
  Luca.util.isIE = ()->
40
50
  try
41
51
  Object.defineProperty({}, '', {})
@@ -118,3 +128,40 @@ Luca.util.badge = (contents="", type, baseClass="badge")->
118
128
  cssClass += " #{ baseClass }-#{ type }" if type?
119
129
  Luca.util.make("span",{class:cssClass},contents)
120
130
 
131
+ Luca.util.setupHooks = (set)->
132
+ set ||= @hooks
133
+
134
+ _(set).each (eventId)=>
135
+ fn = Luca.util.hook( eventId )
136
+
137
+ callback = ()->
138
+ @[fn]?.apply @, arguments
139
+
140
+ callback = _.once(callback) if eventId?.match(/once:/)
141
+
142
+ @on eventId, callback, @
143
+
144
+ Luca.util.setupHooksAdvanced = (set)->
145
+ set ||= @hooks
146
+
147
+ _(set).each (eventId)=>
148
+ hookSetup = @[ Luca.util.hook( eventId ) ]
149
+
150
+ unless _.isArray(hookSetup)
151
+ hookSetup = [hookSetup]
152
+
153
+ for entry in hookSetup
154
+ fn = if _.isString(entry)
155
+ @[ entry ]
156
+
157
+ if _.isFunction(entry)
158
+ fn = entry
159
+
160
+ callback = ()->
161
+ @[fn]?.apply @, arguments
162
+
163
+ if eventId?.match(/once:/)
164
+ callback = _.once(callback)
165
+
166
+ @on eventId, callback, @
167
+
@@ -18308,9 +18308,9 @@ if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
18308
18308
  historyIndex: 0,
18309
18309
  width: 1000,
18310
18310
  componentEvents: {
18311
- "code_input key:keyup": "historyUp",
18312
- "code_input key:keydown": "historyDown",
18313
- "code_input key:enter": "runCommand"
18311
+ "input key:keyup": "historyUp",
18312
+ "input key:keydown": "historyDown",
18313
+ "input key:enter": "runCommand"
18314
18314
  },
18315
18315
  compileOptions: {
18316
18316
  bare: true
@@ -18318,7 +18318,7 @@ if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
18318
18318
  components: [
18319
18319
  {
18320
18320
  type: "code_mirror_field",
18321
- getter: "getCodeMirror",
18321
+ role: "code_mirror",
18322
18322
  additionalClassNames: "clearfix",
18323
18323
  name: "code_output",
18324
18324
  readOnly: true,
@@ -18329,7 +18329,7 @@ if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
18329
18329
  }, {
18330
18330
  type: "text_field",
18331
18331
  name: "code_input",
18332
- getter: "getInput",
18332
+ role: "input",
18333
18333
  lineNumbers: false,
18334
18334
  height: '30px',
18335
18335
  maxHeight: '30px',