sproutcore 0.9.17 → 0.9.18

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 (72) hide show
  1. data/History.txt +45 -2
  2. data/Manifest.txt +10 -0
  3. data/Rakefile +1 -1
  4. data/app_generators/sproutcore/templates/sc-config +8 -2
  5. data/bin/sc-server +4 -0
  6. data/clients/sc_docs/english.lproj/body.css +0 -20
  7. data/clients/sc_docs/english.lproj/body.rhtml +1 -3
  8. data/clients/sc_docs/english.lproj/strings.js +1 -1
  9. data/clients/sc_docs/french.lproj/strings.js +14 -0
  10. data/clients/sc_test_runner/english.lproj/body.css +0 -20
  11. data/clients/sc_test_runner/english.lproj/body.rhtml +1 -3
  12. data/config/hoe.rb +1 -1
  13. data/frameworks/sproutcore/HISTORY +56 -1
  14. data/frameworks/sproutcore/debug/trace.js +81 -0
  15. data/frameworks/sproutcore/debug/unittest.js +2 -1
  16. data/frameworks/sproutcore/english.lproj/buttons.css +5 -2
  17. data/frameworks/sproutcore/english.lproj/core.css +0 -16
  18. data/frameworks/sproutcore/english.lproj/images/sc-theme-sprite.png +0 -0
  19. data/frameworks/sproutcore/english.lproj/splitview.css +83 -0
  20. data/frameworks/sproutcore/english.lproj/theme.css +21 -5
  21. data/frameworks/sproutcore/foundation/object.js +23 -0
  22. data/frameworks/sproutcore/foundation/string.js +4 -3
  23. data/frameworks/sproutcore/lib/core_views.rb +43 -8
  24. data/frameworks/sproutcore/lib/form_views.rb +2 -2
  25. data/frameworks/sproutcore/lib/index.rhtml +1 -1
  26. data/frameworks/sproutcore/mixins/enumerable.js +4 -8
  27. data/frameworks/sproutcore/mixins/selection_support.js +1 -1
  28. data/frameworks/sproutcore/models/collection.js +14 -3
  29. data/frameworks/sproutcore/models/record.js +6 -5
  30. data/frameworks/sproutcore/models/store.js +3 -3
  31. data/frameworks/sproutcore/panes/picker.js +1 -0
  32. data/frameworks/sproutcore/server/rails_server.js +4 -7
  33. data/frameworks/sproutcore/server/server.js +58 -1
  34. data/frameworks/sproutcore/tests/controllers/object.rhtml +1 -1
  35. data/frameworks/sproutcore/tests/models/collection.rhtml +160 -0
  36. data/frameworks/sproutcore/tests/models/model.rhtml +15 -3
  37. data/frameworks/sproutcore/tests/views/collection/base.rhtml +120 -47
  38. data/frameworks/sproutcore/tests/views/collection/source_list_rendering.rhtml +232 -0
  39. data/frameworks/sproutcore/tests/views/view/frame.rhtml +2 -2
  40. data/frameworks/sproutcore/tests/views/view/innerFrame.rhtml +87 -85
  41. data/frameworks/sproutcore/tests/views/view/scrollFrame.rhtml +25 -26
  42. data/frameworks/sproutcore/views/collection/collection.js +5 -1
  43. data/frameworks/sproutcore/views/field/select_field.js +1 -1
  44. data/frameworks/sproutcore/views/radio_group.js +2 -2
  45. data/frameworks/sproutcore/views/split.js +191 -174
  46. data/frameworks/sproutcore/views/split_divider.js +71 -68
  47. data/frameworks/sproutcore/views/view.js +65 -25
  48. data/lib/sproutcore.rb +4 -1
  49. data/lib/sproutcore/build_tools/html_builder.rb +50 -46
  50. data/lib/sproutcore/build_tools/resource_builder.rb +17 -5
  51. data/lib/sproutcore/bundle_installer.rb +3 -1
  52. data/lib/sproutcore/bundle_manifest.rb +4 -3
  53. data/lib/sproutcore/cssmin.rb +195 -0
  54. data/lib/sproutcore/generator_helper.rb +15 -0
  55. data/lib/sproutcore/helpers/capture_helper.rb +2 -22
  56. data/lib/sproutcore/helpers/dom_id_helper.rb +14 -0
  57. data/lib/sproutcore/helpers/static_helper.rb +6 -2
  58. data/lib/sproutcore/helpers/text_helper.rb +1 -1
  59. data/lib/sproutcore/merb.rb +2 -2
  60. data/lib/sproutcore/renderers/erubis.rb +43 -0
  61. data/lib/sproutcore/renderers/haml.rb +28 -0
  62. data/lib/sproutcore/renderers/sass.rb +42 -0
  63. data/lib/sproutcore/version.rb +1 -1
  64. data/lib/sproutcore/view_helpers.rb +40 -46
  65. data/sc_generators/controller/controller_generator.rb +1 -1
  66. data/sc_generators/language/USAGE +5 -7
  67. data/sc_generators/language/language_generator.rb +1 -1
  68. data/sc_generators/language/templates/strings.js +5 -1
  69. data/sc_generators/model/model_generator.rb +1 -1
  70. data/sc_generators/test/test_generator.rb +1 -1
  71. data/sc_generators/view/view_generator.rb +1 -1
  72. metadata +12 -5
@@ -291,16 +291,19 @@ a.regular.image span.label {
291
291
  .sc-theme a.regular.segment.segment-inner,
292
292
  .sc-theme a.regular.segment.segment-left {
293
293
  border-right: 1px #888 solid ;
294
+ height: 21px;
294
295
  }
295
296
 
296
297
  .sc-theme .sc-square-theme a.regular.segment.segment-inner,
297
298
  .sc-theme .sc-square-theme a.regular.segment.segment-left {
298
299
  border-right: 1px solid #625560;
300
+ height: 21px;
299
301
  }
300
302
 
301
303
  .sc-theme .sc-square-theme a.regular.segment.segment-inner.disabled,
302
304
  .sc-theme .sc-square-theme a.regular.segment.segment-left.disabled {
303
305
  border-right: 1px solid #888;
306
+ height: 21px;
304
307
  }
305
308
 
306
309
  .sc-theme a.segment span.label {
@@ -422,11 +425,11 @@ a.regular.image span.label {
422
425
  }
423
426
 
424
427
  .sc-theme a.radio.sel.disabled img.button {
425
- background: static_url('images/sc-theme-sprite.png') no-repeat -16px -792px;
428
+ background: static_url('images/sc-theme-sprite.png') no-repeat -16px -808px;
426
429
  }
427
430
 
428
431
  .sc-theme a.radio.mixed.disabled img.button {
429
- background: static_url('images/sc-theme-sprite.png') no-repeat -16px -792px;
432
+ background: static_url('images/sc-theme-sprite.png') no-repeat -32px -808px;
430
433
  }
431
434
 
432
435
 
@@ -109,22 +109,6 @@
109
109
 
110
110
  /* @end */
111
111
 
112
- /* @group SC.SplitView */
113
-
114
- .sc-split_view > * {
115
- position: absolute ;
116
- }
117
-
118
- .sc-split-view.horizontal .sc-split-divider-view {
119
- cursor: ew-resize;
120
- }
121
-
122
- .sc-split-view.vertical .sc-split-divider-view {
123
- cursor: ns-resize;
124
- }
125
-
126
- /* @end */
127
-
128
112
  /* @group SC.InlineTextFieldView */
129
113
 
130
114
  .sc-inline-text-field-view {
@@ -0,0 +1,83 @@
1
+ /* @override http://localhost:4020/static/sproutcore/en/_cache/panes-1206750928.css */
2
+
3
+ /* @group SC.SplitView */
4
+
5
+ .sc-split-view.horizontal > div {
6
+ position: absolute;
7
+ top: 0;
8
+ bottom: 0;
9
+ left: 155px;
10
+ right: 0;
11
+ }
12
+
13
+ .sc-split-view.horizontal.thin > div {
14
+ left: 151px;
15
+ }
16
+
17
+ .sc-split-view.horizontal.thick > div {
18
+ left: 159px;
19
+ }
20
+
21
+ .sc-split-view.horizontal > div:first-child {
22
+ left: 0;
23
+ width: 150px;
24
+ right: auto;
25
+ }
26
+
27
+ .sc-split-view.horizontal > .sc-split-divider-view {
28
+ cursor: ew-resize;
29
+ width: 3px;
30
+ left: 150px;
31
+ right: auto;
32
+ }
33
+
34
+ .sc-split-view.horizontal.thin > .sc-split-divider-view {
35
+ left: 150px;
36
+ width: 1px;
37
+ }
38
+
39
+ .sc-split-view.horizontal.thick > .sc-split-divider-view {
40
+ left: 150px;
41
+ width: 7px;
42
+ }
43
+
44
+ .sc-split-view.vertical > div {
45
+ position: absolute;
46
+ top: 155px;
47
+ bottom: 0;
48
+ left: 0;
49
+ right: 0;
50
+ }
51
+
52
+ .sc-split-view.vertical.thin > div {
53
+ top: 151px;
54
+ }
55
+
56
+ .sc-split-view.vertical.thick > div {
57
+ top: 159px;
58
+ }
59
+
60
+ .sc-split-view.vertical > div:first-child {
61
+ top: 0;
62
+ height: 150px;
63
+ bottom: auto;
64
+ }
65
+
66
+ .sc-split-view.vertical > .sc-split-divider-view {
67
+ cursor: ns-resize;
68
+ height: 3px;
69
+ top: 150px;
70
+ bottom: auto;
71
+ }
72
+
73
+ .sc-split-view.vertical.thin > .sc-split-divider-view {
74
+ top: 150px;
75
+ height: 1px;
76
+ }
77
+
78
+ .sc-split-view.vertical.thick > .sc-split-divider-view {
79
+ top: 150px;
80
+ height: 7px;
81
+ }
82
+
83
+ /* @end */
@@ -231,19 +231,35 @@ body.sc-theme {
231
231
 
232
232
  /* @group SC.SplitView */
233
233
 
234
- .sc-theme .horizontal .sc-split-divider-view {
234
+ .sc-theme .sc-split-view {
235
+ overflow: hidden !important;
236
+ }
237
+
238
+ .sc-theme .sc-split-view.horizontal > .sc-split-divider-view {
235
239
  background: static_url('images/sc-theme-ysprite.png') repeat-y 0px top;
236
240
  border-left: 1px #888 solid;
237
- border-right: 1px #888 solid ;
238
- z-index: 5;
239
- width: 3px;
241
+ border-right: 1px #888 solid;
242
+ z-index: 5;
243
+ }
244
+
245
+ .sc-theme .sc-split-view.vertical > .sc-split-divider-view {
246
+ background: static_url('images/sc-theme-sprite.png') repeat-x 0px -1397px;
247
+ border-top: 1px #888 solid;
248
+ border-bottom: 1px #888 solid;
249
+ z-index: 5;
250
+ }
251
+
252
+ .sc-theme .sc-split-view.thin > .sc-split-divider-view {
253
+ border: 0;
254
+ background: 0;
255
+ background-color: #888;
240
256
  }
241
257
 
242
258
  /* @end */
243
259
 
244
260
  /* @group Root Form */
245
261
 
246
- input.show-hint {
262
+ textarea.show-hint, input.show-hint {
247
263
  color: #888;
248
264
  }
249
265
 
@@ -171,6 +171,7 @@ SC.mixin(SC.Object, /** @scope SC.Object */ {
171
171
  a search. This can be expensive the first time it is called.
172
172
  */
173
173
  objectClassName: function() {
174
+ if (!SC._onloadQueueFlushed) return ''; // class names are not available until SC.didLoad is called
174
175
  if (!this._objectClassName) this._findObjectClassNames() ;
175
176
  if (this._objectClassName) return this._objectClassName ;
176
177
  var ret = this ;
@@ -226,6 +227,28 @@ SC.mixin(SC.Object, /** @scope SC.Object */ {
226
227
  } ;
227
228
 
228
229
  searchObject(null, window, 2) ;
230
+
231
+ // Internet Explorer doesn's loop over global variables...
232
+ if ( SC.isIE() ) {
233
+ searchObject('SC', SC, 2) ; // get names for the SC classes
234
+
235
+ // get names for the model classes, including nested namespaces (untested)
236
+ for ( var i = 0; i < SC.Server.servers.length; i++ ) {
237
+ var server = SC.Server.servers[i];
238
+ if (server.prefix) {
239
+ for (var prefixLoc = 0; prefixLoc < server.prefix.length; prefixLoc++) {
240
+ var prefixParts = server.prefix[prefixLoc].split('.');
241
+ var namespace = window;
242
+ var namespaceName;
243
+ for (var prefixPartsLoc = 0; prefixPartsLoc < prefixParts.length; prefixPartsLoc++) {
244
+ namespace = namespace[prefixParts[prefixPartsLoc]] ;
245
+ namepaceName = prefixParts[prefixPartsLoc];
246
+ }
247
+ searchObject(namepaceName, namespace, 2) ;
248
+ }
249
+ }
250
+ }
251
+ }
229
252
  },
230
253
 
231
254
  toString: function() { return this.objectClassName(); },
@@ -44,10 +44,11 @@ SC.String = {
44
44
  */
45
45
  fmt: function() {
46
46
  // first, replace any ORDERED replacements.
47
+ var args = arguments;
47
48
  var str = this.gsub(/%@([0-9]+)/, function(m) {
48
- return (arguments[parseInt(m[1],0)-1] || '').toString();
49
+ return (args[parseInt(m[1],0)-1] || '').toString();
49
50
  }) ;
50
-
51
+
51
52
  // now, replace any remaining %@ items. Use this indexOf() method b/c
52
53
  // it is faster than split().
53
54
  var ret = [] ;
@@ -60,7 +61,7 @@ SC.String = {
60
61
  loc = idx + 2 ; // 2 to skip '%@'.
61
62
 
62
63
  // add in replacement.
63
- var value = arguments[argIdx++] ;
64
+ var value = args[argIdx++] ;
64
65
  if (value && value.toString) value = value.toString() ;
65
66
  ret.push(value) ;
66
67
  }
@@ -44,10 +44,13 @@ view_helper :view do
44
44
  property :content_value_key
45
45
 
46
46
  # For SC.SplitView support
47
- property :max_thickness
48
- property :min_thickness
49
- property :can_collapse
50
- property :collapsed, :key => 'isCollapsed'
47
+ if parent_context && parent_context.view_helper_id == :split_view
48
+ property :max_thickness
49
+ property :min_thickness
50
+ property :collapse_at_thickness
51
+ property :can_collapse
52
+ property :collapsed, :key => 'isCollapsed'
53
+ end
51
54
 
52
55
  # General delegate support
53
56
  property(:delegate) { |x| x }
@@ -102,7 +105,7 @@ view_helper :view do
102
105
  css_styles << @style unless @style.nil?
103
106
 
104
107
  # Standard CSS attributes you can pass as attributes to standard view helpers.
105
- common_css_keys = [:width, :height, :min_height, :max_height, :min_width, :max_width]
108
+ common_css_keys = [:width, :height, :min_height, :max_height, :min_width, :max_width, :top, :bottom, :right, :left]
106
109
 
107
110
  common_css_keys.each do | key |
108
111
  value = var key
@@ -114,8 +117,18 @@ view_helper :view do
114
117
  end
115
118
 
116
119
  # render the basic content
117
- content { (@tag == 'img') ? %(<#{@tag} #{attributes} />) : %(#{ot}#{@inner_html}#{ct}) }
118
-
120
+ content do
121
+ ret = ""
122
+
123
+ if parent_context && parent_context.view_helper_id == :split_view
124
+ if parent_context.child_contexts.size == 2 && view_helper_id != :split_divider_view
125
+ # insert split divider view
126
+ ret << parent_context.render_source.split_divider_view(:current_context => parent_context)
127
+ end
128
+ end
129
+
130
+ ret << ((@tag == 'img') ? %(<#{@tag} #{attributes} />) : %(#{ot}#{@inner_html}#{ct}))
131
+ end
119
132
  end
120
133
 
121
134
  # Render an SC.LabelView. Inherits from SC.View
@@ -279,12 +292,34 @@ view_helper :split_view do
279
292
  property :direction, :key => 'layoutDirection'
280
293
  property :can_collapse_views
281
294
 
282
- var :direction, 'horizontal'
295
+ var :direction, :horizontal
296
+ var :splitter, :default
283
297
  css_class_names << 'sc-split-view'
284
298
  css_class_names << @direction
299
+ css_class_names << @splitter
285
300
  end
286
301
 
287
302
  view_helper :split_divider_view do
303
+ if pc = options[:current_context]
304
+ # pc == render_context of split_view
305
+
306
+ var :splitter_thickness, case pc.var(:splitter, :default)
307
+ when :thin : 1
308
+ when :thick : 9
309
+ else 5
310
+ end
311
+
312
+ if pc.var(:direction, :horizontal) == :horizontal
313
+ var :left, pc.child_contexts[0].var(:width, 150)
314
+ css_styles << "left: #{@left}px"
315
+ pc.child_contexts[1].css_styles << "left: #{@left + @splitter_thickness}px;"
316
+ else
317
+ var :top, pc.child_contexts[0].var(:height, 150)
318
+ css_styles << "top: #{@top}px"
319
+ pc.child_contexts[1].css_styles << "top: #{@top + @splitter_thickness}px;"
320
+ end
321
+ end
322
+
288
323
  view 'SC.SplitDividerView'
289
324
  css_class_names << 'sc-split-divider-view'
290
325
  end
@@ -162,8 +162,8 @@ view_helper :text_area_view do
162
162
  property :value
163
163
  end
164
164
 
165
- attribute :cols
166
- attribute :rows
165
+ attribute :cols, 72
166
+ attribute :rows, 10
167
167
  attribute :validate
168
168
  attribute :label
169
169
  attribute :name
@@ -10,7 +10,7 @@
10
10
  -%>
11
11
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
12
12
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
13
- <html>
13
+ <html xmlns="http://www.w3.org/1999/xhtml">
14
14
  <head>
15
15
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
16
16
  <% # @title will be defined if you passed :title in routes.rb -%>
@@ -491,10 +491,9 @@ SC.Enumerable = {
491
491
  if (len <= 0) return [] ; // nothing to invoke....
492
492
 
493
493
  // collect the arguments
494
- var args = null ;
494
+ var args = [] ;
495
495
  var alen = arguments.length ;
496
496
  if (alen > 1) {
497
- args = [] ;
498
497
  for(var idx=1;idx<alen;idx++) args.push(arguments[idx]) ;
499
498
  }
500
499
 
@@ -529,10 +528,9 @@ SC.Enumerable = {
529
528
  if (len <= 0) return null; // nothing to invoke....
530
529
 
531
530
  // collect the arguments
532
- var args = null ;
531
+ var args = [] ;
533
532
  var alen = arguments.length ;
534
533
  if (alen > 2) {
535
- args = [] ;
536
534
  for(var idx=2;idx<alen;idx++) args.push(arguments[idx]) ;
537
535
  }
538
536
 
@@ -839,10 +837,9 @@ SC.mixin(Array.prototype, SC.Reducers) ;
839
837
  if (len <= 0) return [] ; // nothing to invoke....
840
838
 
841
839
  // collect the arguments
842
- var args = null ;
840
+ var args = [] ;
843
841
  var alen = arguments.length ;
844
842
  if (alen > 1) {
845
- args = [] ;
846
843
  for(var idx=1;idx<alen;idx++) args.push(arguments[idx]) ;
847
844
  }
848
845
 
@@ -861,10 +858,9 @@ SC.mixin(Array.prototype, SC.Reducers) ;
861
858
  if (len <= 0) return null ; // nothing to invoke....
862
859
 
863
860
  // collect the arguments
864
- var args = null ;
861
+ var args = [] ;
865
862
  var alen = arguments.length ;
866
863
  if (alen > 2) {
867
- args = [] ;
868
864
  for(var idx=2;idx<alen;idx++) args.push(arguments[idx]) ;
869
865
  }
870
866
 
@@ -153,7 +153,7 @@ SC.SelectionSupport = {
153
153
  */
154
154
  hasSelection: function() {
155
155
  var sel = this.get('selection') ;
156
- return sel && (sel.get('length') > 0) ;
156
+ return !!sel && (sel.get('length') > 0) ;
157
157
  }.property('selection')
158
158
 
159
159
  };
@@ -193,7 +193,8 @@ SC.Collection = SC.Object.extend(
193
193
  destroy: function() { SC.Store.removeCollection(this); return this; },
194
194
 
195
195
  /**
196
- TODO: Needs documentation.
196
+ Creates a record and immediately adds it to the store. Any collections which
197
+ match this record will be notified immediately.
197
198
  */
198
199
  newRecord: function(settings) {
199
200
  if (!settings) settings = {} ;
@@ -203,6 +204,16 @@ SC.Collection = SC.Object.extend(
203
204
  SC.Store.addRecord(ret) ; // this will add the record to the collection.
204
205
  return ret;
205
206
  },
207
+
208
+ /**
209
+ This method removes a record from the store, destroying it.
210
+ */
211
+ removeRecords: function(objects) {
212
+ objects = $A(arguments).flatten();
213
+ for (var i=0; i<objects.length; i++) {
214
+ objects[i].destroy();
215
+ }
216
+ },
206
217
 
207
218
  // ........................................
208
219
  // INTERNAL
@@ -312,8 +323,8 @@ SC.Collection = SC.Object.extend(
312
323
  while ((records.length > 0) && goAgain) {
313
324
  var rec = records[0] ;
314
325
  if ((rec != working) && !rec.get('isDeleted') && rec.matchConditions(conditions)) {
315
- if ((rec == working) || (rec.compareTo(working,order) <= 0)) {
316
- if (rec != working) current.splice(loc,0,rec) ; // insert only if not the same.
326
+ if (rec.compareTo(working,order) < 0) {
327
+ current.splice(loc,0,rec) ;
317
328
  loc++ ;
318
329
  } else goAgain = false ;
319
330
  }