luca 0.9.1 → 0.9.2

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 (59) hide show
  1. data/CHANGELOG +9 -0
  2. data/ROADMAP +15 -3
  3. data/Rakefile +33 -7
  4. data/app.rb +0 -1
  5. data/assets/javascripts/dependencies.coffee +0 -1
  6. data/assets/javascripts/sandbox/application.coffee +1 -1
  7. data/assets/javascripts/sandbox/templates/main.luca +52 -34
  8. data/assets/javascripts/sandbox/templates/sandbox/navigation.luca +3 -1
  9. data/assets/stylesheets/bootstrap-responsive.min.css +0 -1
  10. data/assets/stylesheets/bootstrap.min.css +48 -29
  11. data/assets/stylesheets/sandbox/sandbox.scss +11 -28
  12. data/lib/luca/rails/version.rb +1 -1
  13. data/site/assets/dependencies.js +94 -0
  14. data/site/assets/glyphicons-halflings-white.png +0 -0
  15. data/site/assets/glyphicons-halflings.png +0 -0
  16. data/site/assets/luca-ui-bootstrap.css +1313 -0
  17. data/site/assets/luca-ui-bootstrap.js +9 -0
  18. data/site/assets/luca-ui-development-tools.css +224 -0
  19. data/site/assets/luca-ui-development-tools.js +18561 -0
  20. data/site/assets/sandbox.css +14 -0
  21. data/site/assets/sandbox.js +131 -0
  22. data/site/index.html +20 -0
  23. data/spec/core/collection_spec.coffee +6 -6
  24. data/spec/core/view_spec.coffee +1 -0
  25. data/spec/framework_spec.coffee +7 -0
  26. data/spec/managers/collection_manager_spec.coffee +2 -1
  27. data/src/components/application.coffee +8 -4
  28. data/src/components/collection_view.coffee +8 -2
  29. data/src/components/fields/checkbox_array.coffee +3 -1
  30. data/src/components/form_view.coffee +46 -21
  31. data/src/components/grid_view.coffee +2 -4
  32. data/src/components/nav_bar.coffee +3 -7
  33. data/src/containers/tab_view.coffee +15 -2
  34. data/src/containers/viewport.coffee +13 -4
  35. data/src/core/collection.coffee +68 -53
  36. data/src/core/core.coffee +7 -2
  37. data/src/core/panel.coffee +32 -17
  38. data/src/core/registry.coffee +11 -3
  39. data/src/core/util.coffee +17 -1
  40. data/src/core/view.coffee +6 -5
  41. data/src/framework.coffee +46 -2
  42. data/src/managers/collection_manager.coffee +22 -81
  43. data/src/stylesheets/components/checkbox_array.scss +5 -0
  44. data/src/templates/components/form_alert +0 -0
  45. data/src/templates/components/form_alert.luca +3 -0
  46. data/src/templates/containers/tab_view.luca +1 -1
  47. data/src/tools/console.coffee +3 -0
  48. data/vendor/assets/javascripts/luca-ui-base.js +266 -128
  49. data/vendor/assets/javascripts/luca-ui-development-tools.js +3 -161
  50. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +15 -0
  51. data/vendor/assets/javascripts/luca-ui-spec.js +380 -176
  52. data/vendor/assets/javascripts/luca-ui.js +348 -166
  53. data/vendor/assets/javascripts/luca-ui.min.js +4 -3
  54. data/vendor/assets/stylesheets/luca-ui-bootstrap.css +50 -29
  55. data/vendor/assets/stylesheets/luca-ui-spec.css +2 -0
  56. data/vendor/assets/stylesheets/luca-ui.css +2 -0
  57. metadata +16 -4
  58. data/src/templates/components/form_view.luca +0 -4
  59. data/src/tools/development_console.coffee +0 -147
@@ -12,54 +12,13 @@ _.def("Luca.Collection").extends( source ).with
12
12
  # @resetEvents are 'add','remove',reset' and 'change'.
13
13
  cachedMethods: []
14
14
 
15
- restoreMethodCache: ()->
16
- for name, config of @_methodCache
17
- if config.original?
18
- config.args = undefined
19
- @[ name ] = config.original
20
-
21
- clearMethodCache: (method)->
22
- @_methodCache[method].value = undefined
23
-
24
- clearAllMethodsCache: ()->
25
- for name, config of @_methodCache
26
- @clearMethodCache(name)
27
-
28
- setupMethodCaching: ()->
29
- collection = @
30
- membershipEvents = ["reset","add","remove"]
31
- cache = @_methodCache = {}
32
-
33
- _( @cachedMethods ).each (method)->
34
- # store a reference to the unwrapped version of the method
35
- # and a placeholder for the cached value
36
- cache[ method ] =
37
- name: method
38
- original: collection[method]
39
- value: undefined
40
-
41
- # wrap the collection method with a basic memoize operation
42
- collection[ method ] = ()->
43
- cache[method].value ||= cache[method].original.apply collection, arguments
44
-
45
- # bind to events on the collection, which once triggered, will
46
- # invalidate the cached value. causing us to have to restore it
47
- for membershipEvent in membershipEvents
48
- collection.bind membershipEvent, ()->
49
- collection.clearAllMethodsCache()
50
-
51
- dependencies = method.split(':')[1]
52
-
53
- if dependencies
54
- for dependency in dependencies.split(",")
55
- collection.bind "change:#{dependency}", ()->
56
- collection.clearMethodCache(method: method)
15
+ # if filtering a collection should handle via a call to a REST API
16
+ # and return the filtered results that way, then leave this true
17
+ remoteFilter: false
57
18
 
58
19
  initialize: (models=[], @options)->
59
20
  _.extend @, @options
60
-
61
21
  @setupMethodCaching()
62
-
63
22
  @_reset()
64
23
 
65
24
  # By specifying a @cache_key property or method, you can instruct
@@ -80,6 +39,8 @@ _.def("Luca.Collection").extends( source ).with
80
39
  @name ||= @registerAs
81
40
  @manager ||= @registerWith
82
41
 
42
+ @manager = if _.isFunction(@manager) then @manager() else @manager
43
+
83
44
  # if they specify a
84
45
  if @name and not @manager
85
46
  @manager = Luca.CollectionManager.get()
@@ -162,15 +123,11 @@ _.def("Luca.Collection").extends( source ).with
162
123
  _.uniq(parts).join("&")
163
124
 
164
125
  resetFilter: ()->
165
- @base_params = Luca.Collection.baseParams()
126
+ @base_params = _( Luca.Collection.baseParams() ).clone()
166
127
  @
167
128
 
168
- # if filtering a collection should handle via a call to a REST API
169
- # and return the filtered results that way, then leave this true
170
- remoteFilter: true
171
-
172
129
  applyFilter: (filter={}, options={})->
173
- if options.remote? is true
130
+ if options.remote? is true or @remoteFilter is true
174
131
  @applyParams(filter)
175
132
  @fetch _.extend(options,refresh:true)
176
133
  else
@@ -179,9 +136,11 @@ _.def("Luca.Collection").extends( source ).with
179
136
  # You can apply params to a collection, so that any upcoming requests
180
137
  # made to the REST API are made with the key values specified
181
138
  applyParams: (params)->
182
- @base_params ||= _( Luca.Collection.baseParams() ).clone()
139
+ @base_params = _( Luca.Collection.baseParams() ).clone()
183
140
  _.extend @base_params, params
184
141
 
142
+ @
143
+
185
144
  # If this collection is to be registered with some global collection
186
145
  # tracker such as new Luca.CollectionManager() then we will register
187
146
  # ourselves automatically
@@ -286,7 +245,7 @@ _.def("Luca.Collection").extends( source ).with
286
245
  if @length > 0 and not @fetching
287
246
  fn.apply scope, [@]
288
247
 
289
- @bind "reset", (collection)=> fn.apply scope, [collection]
248
+ @bind "reset", (collection)=> fn.call(scope,collection)
290
249
 
291
250
  unless @fetching is true or !options.autoFetch or @length > 0
292
251
  @fetch()
@@ -312,6 +271,62 @@ _.def("Luca.Collection").extends( source ).with
312
271
 
313
272
  models
314
273
 
274
+ # Method Caching
275
+ #
276
+ # Method Caching is a way of saving the output of a method on your collection.
277
+ # And then expiring that value if any changes are detected to the models in
278
+ # the collection
279
+ restoreMethodCache: ()->
280
+ for name, config of @_methodCache
281
+ if config.original?
282
+ config.args = undefined
283
+ @[ name ] = config.original
284
+
285
+ clearMethodCache: (method)->
286
+ @_methodCache[method].value = undefined
287
+
288
+ clearAllMethodsCache: ()->
289
+ for name, config of @_methodCache
290
+ @clearMethodCache(name)
291
+
292
+ setupMethodCaching: ()->
293
+ collection = @
294
+ membershipEvents = ["reset","add","remove"]
295
+ cache = @_methodCache = {}
296
+
297
+ _( @cachedMethods ).each (method)->
298
+ # store a reference to the unwrapped version of the method
299
+ # and a placeholder for the cached value
300
+ cache[ method ] =
301
+ name: method
302
+ original: collection[method]
303
+ value: undefined
304
+
305
+ # wrap the collection method with a basic memoize operation
306
+ collection[ method ] = ()->
307
+ cache[method].value ||= cache[method].original.apply collection, arguments
308
+
309
+ # bind to events on the collection, which once triggered, will
310
+ # invalidate the cached value. causing us to have to restore it
311
+ for membershipEvent in membershipEvents
312
+ collection.bind membershipEvent, ()->
313
+ collection.clearAllMethodsCache()
314
+
315
+ dependencies = method.split(':')[1]
316
+
317
+ if dependencies
318
+ for dependency in dependencies.split(",")
319
+ collection.bind "change:#{dependency}", ()->
320
+ collection.clearMethodCache(method: method)
321
+
322
+ # make sure the querying interface from backbone.query is present
323
+ # in the case backbone-query isn't loaded. without it, it will
324
+ # just return the models
325
+ query: (filter={},options={})->
326
+ if Backbone.QueryCollection?
327
+ return Backbone.QueryCollection::query.apply(@, arguments)
328
+ else
329
+ @models
315
330
 
316
331
  # Global Collection Observer
317
332
  _.extend Luca.Collection.prototype,
@@ -329,7 +344,7 @@ Luca.Collection.baseParams = (obj)->
329
344
  return Luca.Collection._baseParams = obj if obj
330
345
 
331
346
  if _.isFunction( Luca.Collection._baseParams )
332
- return Luca.Collection._baseParams.call()
347
+ return Luca.Collection._baseParams()
333
348
 
334
349
  if _.isObject( Luca.Collection._baseParams )
335
350
  Luca.Collection._baseParams
data/src/core/core.coffee CHANGED
@@ -59,8 +59,13 @@ class DefineProxy
59
59
 
60
60
  at[@componentId] = Luca.extend(@superClassName,@componentName, properties)
61
61
 
62
- # automatically register this with the component registry
63
- Luca.register( _.string.underscored(@componentId), @componentName)
62
+ if Luca.autoRegister is true
63
+ componentType = "view" if Luca.isViewPrototype( at[@componentId] )
64
+ componentType = "collection" if Luca.isCollectionPrototype( at[@componentId] )
65
+ componentType = "model" if Luca.isModelPrototype( at[@componentId] )
66
+
67
+ # automatically register this with the component registry
68
+ Luca.register( _.string.underscored(@componentId), @componentName, componentType)
64
69
 
65
70
  at[@componentId]
66
71
 
@@ -1,7 +1,7 @@
1
1
  # This is a helper for creating the DOM element that go along with
2
2
  # a given component, if it is configured to use one via the topToolbar
3
3
  # and bottomToolbar properties
4
- attachToolbar = (config={})->
4
+ attachToolbar = (config={}, targetEl)->
5
5
  config.orientation ||= "top"
6
6
  config.ctype ||= @toolbarType || "panel_toolbar"
7
7
 
@@ -25,7 +25,7 @@ attachToolbar = (config={})->
25
25
  when "bottom", "right"
26
26
  if hasBody then "after" else "append"
27
27
 
28
- @$bodyEl()[action]( container )
28
+ (targetEl || @$bodyEl() )[action]( container )
29
29
 
30
30
  # A Panel is a basic Luca.View but with Toolbar extensions
31
31
  #
@@ -42,10 +42,13 @@ _.def("Luca.components.Panel").extends("Luca.View").with
42
42
  # hidden upon successful response
43
43
  loadMask: false
44
44
  loadMaskTemplate: ["components/load_mask"]
45
+ loadMaskTimeout: 3000
45
46
 
46
47
  initialize: (@options={})->
47
48
  Luca.View::initialize.apply(@, arguments)
48
49
 
50
+ _.bindAll @, "applyLoadMask", "disableLoadMask"
51
+
49
52
  if @loadMask is true
50
53
  @defer ()=>
51
54
  @$el.addClass('with-mask')
@@ -61,22 +64,34 @@ _.def("Luca.components.Panel").extends("Luca.View").with
61
64
  loadMaskTarget: ()->
62
65
  if @loadMaskEl? then @$(@loadMaskEl) else @$bodyEl()
63
66
 
67
+ disableLoadMask: ()->
68
+ @$('.load-mask .bar').css("width","100%")
69
+ @$('.load-mask').hide()
70
+ clearInterval(@loadMaskInterval)
71
+
72
+ enableLoadMask: ()->
73
+ @$('.load-mask').show().find('.bar').css("width","0%")
74
+ maxWidth = @$('.load-mask .progress').width()
75
+ if maxWidth < 20 and (maxWidth = @$el.width()) < 20
76
+ maxWidth = @$el.parent().width()
77
+
78
+ @loadMaskInterval = setInterval ()=>
79
+ currentWidth = @$('.load-mask .bar').width()
80
+ newWidth = currentWidth + 12
81
+ @$('.load-mask .bar').css('width', newWidth)
82
+ , 200
83
+
84
+ return unless @loadMaskTimeout?
85
+
86
+ _.delay ()=>
87
+ @disableLoadMask()
88
+ , @loadMaskTimeout
89
+
64
90
  applyLoadMask: ()->
65
91
  if @$('.load-mask').is(":visible")
66
- @$('.load-mask .bar').css("width","100%")
67
- @$('.load-mask').hide()
68
- clearInterval(@loadMaskInterval)
92
+ @disableLoadMask()
69
93
  else
70
- @$('.load-mask').show().find('.bar').css("width","0%")
71
- maxWidth = @$('.load-mask .progress').width()
72
- if maxWidth < 20 and (maxWidth = @$el.width()) < 20
73
- maxWidth = @$el.parent().width()
74
-
75
- @loadMaskInterval = setInterval ()=>
76
- currentWidth = @$('.load-mask .bar').width()
77
- newWidth = currentWidth + 12
78
- @$('.load-mask .bar').css('width', newWidth)
79
- , 200
94
+ @enableLoadMask()
80
95
 
81
96
  applyStyles: (styles={},body=false)->
82
97
 
@@ -114,7 +129,7 @@ _.def("Luca.components.Panel").extends("Luca.View").with
114
129
  $(@el)
115
130
 
116
131
  $wrap: (wrapper)->
117
- if !wrapper.match(/[<>]/)
132
+ if _.isString(wrapper) and not wrapper.match(/[<>]/)
118
133
  wrapper = @make("div",class:wrapper)
119
134
 
120
135
  @$el.wrap( wrapper )
@@ -140,4 +155,4 @@ _.def("Luca.components.Panel").extends("Luca.View").with
140
155
  config.parent = @
141
156
  config.orientation = orientation
142
157
 
143
- attachToolbar.call(@, config)
158
+ attachToolbar.call(@, config, config.targetEl )
@@ -1,5 +1,7 @@
1
1
  registry =
2
2
  classes:{}
3
+ model_classes: {}
4
+ collection_classes: {}
3
5
  namespaces:['Luca.containers','Luca.components']
4
6
 
5
7
  component_cache =
@@ -13,11 +15,17 @@ Luca.defaultComponentType = 'view'
13
15
 
14
16
  # When you use _.def to define a component, you say
15
17
  # which class it extends() from, and with() which enhancements.
16
-
17
18
  # We register that component class for you:
18
- Luca.register = (component, prototypeName)->
19
+ Luca.register = (component, prototypeName, componentType="view")->
19
20
  Luca.trigger "component:registered", component, prototypeName
20
- registry.classes[ component ] = prototypeName
21
+
22
+ switch componentType
23
+ when "model"
24
+ registry.model_classes[ component ] = prototypeName
25
+ when "collection"
26
+ registry.model_classes[ component ] = prototypeName
27
+ else
28
+ registry.classes[ component ] = prototypeName
21
29
 
22
30
  Luca.development_mode_register = (component, prototypeName)->
23
31
  existing = registry.classes[component]
data/src/core/util.coffee CHANGED
@@ -79,4 +79,20 @@ Luca.util.loadScript = (url, callback) ->
79
79
  callback()
80
80
 
81
81
  script.src = url
82
- document.body.appendChild(script)
82
+ document.body.appendChild(script)
83
+
84
+ Luca.util.make = Backbone.View::make
85
+
86
+ # generates a badge element
87
+ # valid types are success, warning, important, info, inverse
88
+ Luca.util.label = (contents="", type, baseClass="label")->
89
+ cssClass = baseClass
90
+ cssClass += " #{ baseClass}-#{ type }" if type?
91
+ Luca.util.make("span",{class:cssClass},contents)
92
+
93
+ # generates a badge element
94
+ # valid types are success, warning, important, info, inverse
95
+ Luca.util.badge = (contents="", type, baseClass="badge")->
96
+ cssClass = baseClass
97
+ cssClass += " #{ baseClass }-#{ type }" if type?
98
+ Luca.util.make("span",{class:cssClass},contents)
data/src/core/view.coffee CHANGED
@@ -66,7 +66,7 @@ _.def("Luca.View").extends("Backbone.View").with
66
66
 
67
67
  #### JQuery / DOM Selector Helpers
68
68
  $wrap: (wrapper)->
69
- if !wrapper.match(/[<>]/)
69
+ if _.isString(wrapper) and not wrapper.match(/[<>]/)
70
70
  wrapper = @make("div",class:wrapper)
71
71
 
72
72
  @$el.wrap( wrapper )
@@ -130,7 +130,7 @@ _.def("Luca.View").extends("Backbone.View").with
130
130
  # if you want to use more than one collection manager, over ride this
131
131
  # function in your views with your own logic
132
132
  getCollectionManager: ()->
133
- @collectionManager || Luca.CollectionManager.get?.call()
133
+ @collectionManager || Luca.CollectionManager.get?()
134
134
 
135
135
  ##### Collection Events
136
136
  #
@@ -247,10 +247,11 @@ customizeRender = (definition)->
247
247
  target ||= @deferrable
248
248
  trigger = if @deferrable_event then @deferrable_event else "reset"
249
249
 
250
- view.defer ()->
250
+ deferred = ()->
251
251
  _base.call(view)
252
- view.trigger "after:render", view
253
- .until(target,trigger)
252
+ view.trigger("after:render", view)
253
+
254
+ view.defer(deferred).until(target, trigger)
254
255
 
255
256
  view.trigger "before:render", @
256
257
 
data/src/framework.coffee CHANGED
@@ -15,12 +15,11 @@
15
15
  definition = payload.defines
16
16
  inheritsFrom = payload.extends
17
17
 
18
-
19
18
  if _.isFunction( fallback = _(args).last() )
20
19
  return fallback()
21
20
 
22
21
  _.extend Luca,
23
- VERSION: "0.9.1"
22
+ VERSION: "0.9.2"
24
23
  core: {}
25
24
  containers: {}
26
25
  components: {}
@@ -32,6 +31,10 @@ _.extend Luca,
32
31
  # for triggering / binding to component definitions
33
32
  _.extend Luca, Backbone.Events
34
33
 
34
+ # When using Luca.define() should we automatically register
35
+ # the component with the registry?
36
+ Luca.autoRegister = true
37
+
35
38
  # if developmentMode is true, you have access to some neat development tools
36
39
  Luca.developmentMode = false
37
40
 
@@ -72,6 +75,9 @@ Luca.supportsEvents = Luca.supportsBackboneEvents = (obj)->
72
75
  Luca.isComponent = (obj)->
73
76
  Luca.isBackboneModel(obj) or Luca.isBackboneView(obj) or Luca.isBackboneCollection(obj)
74
77
 
78
+ Luca.isComponentPrototype = (obj)->
79
+ Luca.isViewPrototype(obj) or Luca.isModelPrototype(obj) or Luca.isCollectionPrototype(obj)
80
+
75
81
  Luca.isBackboneModel = (obj)->
76
82
  _.isFunction(obj?.set) and _.isFunction(obj?.get) and _.isObject(obj?.attributes)
77
83
 
@@ -81,6 +87,44 @@ Luca.isBackboneView = (obj)->
81
87
  Luca.isBackboneCollection = (obj)->
82
88
  _.isFunction(obj?.fetch) and _.isFunction(obj?.reset)
83
89
 
90
+ Luca.isViewPrototype = (obj)->
91
+ obj? and obj::? and obj::make? and obj::$? and obj::render?
92
+
93
+ Luca.isModelPrototype = (obj)->
94
+ obj? and obj::? obj::save? and obj::changedAttributes?
95
+
96
+ Luca.isCollectionPrototype = (obj)->
97
+ obj? and obj::? and !Luca.isModelPrototype(obj) and obj::reset? and obj::select? and obj::reject?
98
+
99
+ Luca.inheritanceChain = (obj)->
100
+ _( Luca.parentClasses(obj) ).map (className)-> Luca.util.resolve(className)
101
+
102
+ Luca.parentClasses = (obj)->
103
+ list = []
104
+
105
+ if _.isString(obj)
106
+ obj = Luca.util.resolve(obj)
107
+
108
+ list.push( obj.displayName || obj::?.displayName || Luca.parentClass(obj) )
109
+
110
+ classes = until not Luca.parentClass(obj)?
111
+ obj = Luca.parentClass(obj)
112
+
113
+ list = list.concat(classes)
114
+
115
+ _.uniq list
116
+
117
+ Luca.parentClass = (obj)->
118
+ list = []
119
+
120
+ if _.isString( obj )
121
+ obj = Luca.util.resolve(obj)
122
+
123
+ if Luca.isComponent(obj)
124
+ obj.displayName
125
+
126
+ else if Luca.isComponentPrototype(obj)
127
+ obj::_superClass?()?.displayName
84
128
 
85
129
  # This is a convenience method for accessing the templates
86
130
  # available to the client side app, either the ones which ship with Luca
@@ -1,57 +1,28 @@
1
- #### Collection Manager
2
- #
3
- # The purpose of the collection manager is to provide an interface
4
- # for tracking the creation of collections, so that you only create
5
- # one instance of a given collection class per instance of some scope
6
- #
7
- # For example:
8
-
9
- # LucaApp = Luca.containers.Viewport.extend
10
- # initialize: (@options={})->
11
- # @collectionManager = new Luca.CollectionManager
12
- # getScope: ()-> @someParentValue
13
- # collection: (key,options={},models=[])->
14
- # @collectionManager.getOrCreate(key,options,models)
15
- #
16
- # Now in the single global instance of LucaApp you have
17
- # one central place to access a collection of models, one
18
- # interface to listen to for add, remove, reset, change events
19
- #
20
- # If you don't want this, you can either do it the old fashioned way
21
- # or just use the private option to get an unregistered instance.
22
- #
23
-
24
- #### View Event Binding Interface
25
- #
26
- # Luca.Views can specify a @collectionEvents property very similar to
27
- # the DOM @events property in Backbone.Views and this provides a very
28
- # clean API for binding to events on the collection manager and doing
29
- # the necessary things on the view. This does assume that by default
30
- # there is only one instance of the collection manager running, otherwise
31
- # a configuration directive is provided at a view level to know which
32
- # collection manager to pull from.
33
- #
34
- # Special Thanks to @tjbladez for this wonderful initialModelsa
35
- #
36
-
37
- instances = []
38
-
39
- # _.def('Luca.CollectionManager').extends('Luca').with
40
1
  class Luca.CollectionManager
2
+ name: "primary"
3
+
41
4
  __collections: {}
42
5
 
43
6
  constructor: (@options={})->
44
7
  _.extend @, @options
8
+
9
+ manager = @
10
+
11
+ if existing = Luca.CollectionManager.get?(@name)
12
+ throw 'Attempt to create a collection manager with a name which already exists'
13
+
14
+ Luca.CollectionManager.instances ||= {}
15
+
45
16
  _.extend @, Backbone.Events
17
+ _.extend @, Luca.Events
46
18
 
47
- # if you are going to use more than one collection
48
- # manager, then you will have to specify which
49
- # collection manager your views need to interact
50
- # with for their collectionEvents configuration handling
51
- instances.push(@)
19
+ Luca.CollectionManager.instances[ @name ] = manager
52
20
 
53
- # model to maintain state of the collection manager
54
- @state = new Backbone.Model
21
+ Luca.CollectionManager.get = (name)->
22
+ return manager unless name?
23
+ Luca.CollectionManager.instances[name]
24
+
25
+ @state = new Luca.Model()
55
26
 
56
27
  if @initialCollections
57
28
  @state.set({loaded_collections_count: 0, collections_count: @initialCollections.length })
@@ -84,42 +55,22 @@ class Luca.CollectionManager
84
55
 
85
56
  return collection
86
57
 
87
- #### Collection Prefix
88
- #
89
- # If you are doing things right, you are namespacing all of your collection
90
- # definitions, for example
91
- #
92
- # LucaApp.collections.SomeCollection = Luca.Collection.extend
93
- # registerAs: "some_collection"
94
- # registerWith: ""
95
- #
96
- # You should override this attribute when you create or define your collection manager
97
- #
98
- #
99
- collectionNamespace: Luca.Collection.namespace
100
58
 
101
- #### Collection Scopes
59
+ collectionNamespace: Luca.Collection.namespace
102
60
 
103
- # any time you create a collection, or use getOrCreate, the key
104
- # value ( @registerAs ) for your collection will be used to retrieve it
105
- #
106
- # if you plan to have multiple instances per key, but with some sort of
107
- # scope based on a parent attribute, you should define a
61
+
108
62
  currentScope: ()->
109
63
  if current_scope = @getScope()
110
64
  @__collections[ current_scope ] ||= {}
111
65
  else
112
66
  @__collections
113
67
 
114
- # do something to each collection in the scope
115
68
  each: (fn)->
116
69
  _( @all() ).each(fn)
117
70
 
118
71
  get:(key)->
119
72
  @currentScope()[key]
120
73
 
121
- # by default, we won't use a scope, but if you wish to use one
122
- # you should define this method on your collection manager
123
74
  getScope: ()-> undefined
124
75
 
125
76
  getOrCreate: (key,collectionOptions={},initialModels=[])->
@@ -131,9 +82,6 @@ class Luca.CollectionManager
131
82
  guess ||= (@collectionNamespace || (window || global) )[ "#{classified}Collection" ]
132
83
  guess
133
84
 
134
- # load collection, iterates over each name you have passed for the
135
- # your collections in the currentScope, makes sure they exist and
136
- # fetched
137
85
  loadInitialCollections: ()->
138
86
  collectionDidLoad = (collection) =>
139
87
  collection.unbind "reset"
@@ -153,16 +101,9 @@ class Luca.CollectionManager
153
101
 
154
102
  loadedCollectionsCount: ()->
155
103
  @state.get("loaded_collections_count")
156
- # in most cases, the collections we use can be used only once
157
- # and any reset events should be respected, bound to, etc. however
158
- # if this ever isn't the case, you can create an instance
159
- # of a collection which is "private" in that once it is
160
- # returned from the collection manager, it isn't tracked so
161
- # you can make sure any add / reset / remove / filter events
162
- # don't effect other views
104
+
163
105
  private: (key, collectionOptions={}, initialModels=[])->
164
106
  @create(key,collectionOptions,initialModels,true)
165
107
 
166
- Luca.CollectionManager.destroyAll = ()-> instances = []
167
- Luca.CollectionManager.instances = ()-> instances
168
- Luca.CollectionManager.get = ()-> _( instances ).last()
108
+ Luca.CollectionManager.destroyAll = ()->
109
+ Luca.CollectionManager.instances = {}
@@ -0,0 +1,5 @@
1
+ .luca-ui-checkbox-array {
2
+ input.array-checkbox {
3
+ display: inline-block;
4
+ }
5
+ }
File without changes
@@ -0,0 +1,3 @@
1
+ %div{:class=>"<%= className %>"}
2
+ %a.close{:href=>"#",:data=>{:dismiss=>"alert"}} x
3
+ <%= message %>
@@ -1,2 +1,2 @@
1
- %ul.nav.nav-tabs{:id=>"<%= cid %>-tabs-selector"}
1
+ %ul{:id=>"<%= cid %>-tabs-selector",:class=>"nav <%= navClass %>"}
2
2
  %div{:id=>"<%= cid %>-tab-view-content",:class=>"tab-content"}
@@ -56,6 +56,9 @@ Luca.define("Luca.tools.DevelopmentConsole").extends("Luca.core.Container").with
56
56
  @$('input').focus()
57
57
  ]
58
58
 
59
+ show: (options={})->
60
+ @$el.addClass('modal').modal(options)
61
+
59
62
  getContext: ()->
60
63
  window
61
64