sproutcore 0.9.17 → 0.9.18

Sign up to get free protection for your applications and to get access to all the features.
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
  }