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.
- data/History.txt +45 -2
- data/Manifest.txt +10 -0
- data/Rakefile +1 -1
- data/app_generators/sproutcore/templates/sc-config +8 -2
- data/bin/sc-server +4 -0
- data/clients/sc_docs/english.lproj/body.css +0 -20
- data/clients/sc_docs/english.lproj/body.rhtml +1 -3
- data/clients/sc_docs/english.lproj/strings.js +1 -1
- data/clients/sc_docs/french.lproj/strings.js +14 -0
- data/clients/sc_test_runner/english.lproj/body.css +0 -20
- data/clients/sc_test_runner/english.lproj/body.rhtml +1 -3
- data/config/hoe.rb +1 -1
- data/frameworks/sproutcore/HISTORY +56 -1
- data/frameworks/sproutcore/debug/trace.js +81 -0
- data/frameworks/sproutcore/debug/unittest.js +2 -1
- data/frameworks/sproutcore/english.lproj/buttons.css +5 -2
- data/frameworks/sproutcore/english.lproj/core.css +0 -16
- data/frameworks/sproutcore/english.lproj/images/sc-theme-sprite.png +0 -0
- data/frameworks/sproutcore/english.lproj/splitview.css +83 -0
- data/frameworks/sproutcore/english.lproj/theme.css +21 -5
- data/frameworks/sproutcore/foundation/object.js +23 -0
- data/frameworks/sproutcore/foundation/string.js +4 -3
- data/frameworks/sproutcore/lib/core_views.rb +43 -8
- data/frameworks/sproutcore/lib/form_views.rb +2 -2
- data/frameworks/sproutcore/lib/index.rhtml +1 -1
- data/frameworks/sproutcore/mixins/enumerable.js +4 -8
- data/frameworks/sproutcore/mixins/selection_support.js +1 -1
- data/frameworks/sproutcore/models/collection.js +14 -3
- data/frameworks/sproutcore/models/record.js +6 -5
- data/frameworks/sproutcore/models/store.js +3 -3
- data/frameworks/sproutcore/panes/picker.js +1 -0
- data/frameworks/sproutcore/server/rails_server.js +4 -7
- data/frameworks/sproutcore/server/server.js +58 -1
- data/frameworks/sproutcore/tests/controllers/object.rhtml +1 -1
- data/frameworks/sproutcore/tests/models/collection.rhtml +160 -0
- data/frameworks/sproutcore/tests/models/model.rhtml +15 -3
- data/frameworks/sproutcore/tests/views/collection/base.rhtml +120 -47
- data/frameworks/sproutcore/tests/views/collection/source_list_rendering.rhtml +232 -0
- data/frameworks/sproutcore/tests/views/view/frame.rhtml +2 -2
- data/frameworks/sproutcore/tests/views/view/innerFrame.rhtml +87 -85
- data/frameworks/sproutcore/tests/views/view/scrollFrame.rhtml +25 -26
- data/frameworks/sproutcore/views/collection/collection.js +5 -1
- data/frameworks/sproutcore/views/field/select_field.js +1 -1
- data/frameworks/sproutcore/views/radio_group.js +2 -2
- data/frameworks/sproutcore/views/split.js +191 -174
- data/frameworks/sproutcore/views/split_divider.js +71 -68
- data/frameworks/sproutcore/views/view.js +65 -25
- data/lib/sproutcore.rb +4 -1
- data/lib/sproutcore/build_tools/html_builder.rb +50 -46
- data/lib/sproutcore/build_tools/resource_builder.rb +17 -5
- data/lib/sproutcore/bundle_installer.rb +3 -1
- data/lib/sproutcore/bundle_manifest.rb +4 -3
- data/lib/sproutcore/cssmin.rb +195 -0
- data/lib/sproutcore/generator_helper.rb +15 -0
- data/lib/sproutcore/helpers/capture_helper.rb +2 -22
- data/lib/sproutcore/helpers/dom_id_helper.rb +14 -0
- data/lib/sproutcore/helpers/static_helper.rb +6 -2
- data/lib/sproutcore/helpers/text_helper.rb +1 -1
- data/lib/sproutcore/merb.rb +2 -2
- data/lib/sproutcore/renderers/erubis.rb +43 -0
- data/lib/sproutcore/renderers/haml.rb +28 -0
- data/lib/sproutcore/renderers/sass.rb +42 -0
- data/lib/sproutcore/version.rb +1 -1
- data/lib/sproutcore/view_helpers.rb +40 -46
- data/sc_generators/controller/controller_generator.rb +1 -1
- data/sc_generators/language/USAGE +5 -7
- data/sc_generators/language/language_generator.rb +1 -1
- data/sc_generators/language/templates/strings.js +5 -1
- data/sc_generators/model/model_generator.rb +1 -1
- data/sc_generators/test/test_generator.rb +1 -1
- data/sc_generators/view/view_generator.rb +1 -1
- 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 -
|
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 -
|
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 {
|
Binary file
|
@@ -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 .
|
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
|
-
|
239
|
-
|
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 (
|
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 =
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
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,
|
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
|
@@ -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 =
|
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 =
|
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 =
|
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 =
|
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
|
|
@@ -193,7 +193,8 @@ SC.Collection = SC.Object.extend(
|
|
193
193
|
destroy: function() { SC.Store.removeCollection(this); return this; },
|
194
194
|
|
195
195
|
/**
|
196
|
-
|
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 (
|
316
|
-
|
326
|
+
if (rec.compareTo(working,order) < 0) {
|
327
|
+
current.splice(loc,0,rec) ;
|
317
328
|
loc++ ;
|
318
329
|
} else goAgain = false ;
|
319
330
|
}
|