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