sproutcore 0.9.13 → 0.9.14
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 +19 -0
- data/Manifest.txt +103 -26
- data/app_generators/sproutcore/templates/README +1 -1
- data/bin/sc-build +1 -1
- data/bin/sc-gen +0 -0
- data/bin/sc-ide +278 -0
- data/bin/sc-init +38 -0
- data/bin/sc-install +96 -0
- data/bin/sc-remove +94 -0
- data/bin/sc-server +4 -0
- data/bin/sc-update +94 -0
- data/bin/sproutcore +3 -14
- data/clients/sc_docs/controllers/docs.js +1 -1
- data/clients/sc_docs/models/doc.js +6 -0
- data/clients/sc_docs/views/doc_frame.js +1 -1
- data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
- data/frameworks/sproutcore/HISTORY +34 -2
- data/frameworks/sproutcore/controllers/array.js +1 -1
- data/frameworks/sproutcore/controllers/controller.js +1 -1
- data/frameworks/sproutcore/controllers/object.js +9 -6
- data/frameworks/sproutcore/core.js +19 -4
- data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
- data/frameworks/sproutcore/english.lproj/core.css +1 -0
- data/frameworks/sproutcore/english.lproj/menu.css +1 -0
- data/frameworks/sproutcore/foundation/application.js +3 -3
- data/frameworks/sproutcore/foundation/benchmark.js +1 -1
- data/frameworks/sproutcore/foundation/node_descriptor.js +13 -1
- data/frameworks/sproutcore/foundation/page.js +3 -2
- data/frameworks/sproutcore/foundation/path_module.js +33 -16
- data/frameworks/sproutcore/foundation/run_loop.js +1 -1
- data/frameworks/sproutcore/foundation/server.js +68 -18
- data/frameworks/sproutcore/foundation/string.js +1 -1
- data/frameworks/sproutcore/globals/window.js +62 -15
- data/frameworks/sproutcore/lib/core_views.rb +1 -0
- data/frameworks/sproutcore/lib/index.rhtml +4 -3
- data/frameworks/sproutcore/lib/menu_views.rb +2 -2
- data/frameworks/sproutcore/models/collection.js +122 -107
- data/frameworks/sproutcore/models/record.js +2 -2
- data/frameworks/sproutcore/panes/manager.js +1 -1
- data/frameworks/sproutcore/panes/overlay.js +3 -3
- data/frameworks/sproutcore/tests/controllers/object.rhtml +26 -0
- data/frameworks/sproutcore/tests/views/collection/incremental_rendering.rhtml +2 -2
- data/frameworks/sproutcore/views/button/disclosure.js +1 -1
- data/frameworks/sproutcore/views/collection/collection.js +19 -15
- data/frameworks/sproutcore/views/collection/source_list.js +1 -1
- data/frameworks/sproutcore/views/collection/table.js +2 -2
- data/frameworks/sproutcore/views/error_explanation.js +1 -1
- data/frameworks/sproutcore/views/field/checkbox_field.js +1 -1
- data/frameworks/sproutcore/views/field/field.js +1 -1
- data/frameworks/sproutcore/views/field/radio_field.js +1 -1
- data/frameworks/sproutcore/views/field/select_field.js +1 -1
- data/frameworks/sproutcore/views/form.js +1 -1
- data/frameworks/sproutcore/views/image.js +1 -1
- data/frameworks/sproutcore/views/menu_item.js +1 -1
- data/frameworks/sproutcore/views/popup_button.js +1 -1
- data/frameworks/sproutcore/views/popup_menu.js +1 -1
- data/frameworks/sproutcore/views/progress.js +4 -2
- data/frameworks/sproutcore/views/radio_group.js +1 -1
- data/frameworks/sproutcore/views/scroll.js +1 -1
- data/frameworks/sproutcore/views/source_list_group.js +1 -1
- data/frameworks/sproutcore/views/split.js +1 -1
- data/frameworks/sproutcore/views/tab.js +3 -1
- data/frameworks/sproutcore/views/view.js +19 -3
- data/jsdoc/README.txt +89 -57
- data/jsdoc/app/frame/Chain.js +102 -0
- data/jsdoc/app/frame/Dumper.js +144 -0
- data/jsdoc/app/frame/Hash.js +47 -0
- data/jsdoc/app/frame/Link.js +142 -0
- data/jsdoc/app/frame/Namespace.js +10 -0
- data/jsdoc/app/frame/Opt.js +134 -0
- data/jsdoc/app/frame/Reflection.js +26 -0
- data/jsdoc/app/frame/String.js +93 -0
- data/jsdoc/app/frame/Testrun.js +129 -0
- data/jsdoc/app/frame.js +33 -0
- data/jsdoc/app/handlers/FOODOC.js +26 -0
- data/jsdoc/app/handlers/XMLDOC/DomReader.js +159 -0
- data/jsdoc/app/handlers/XMLDOC/XMLDoc.js +16 -0
- data/jsdoc/app/handlers/XMLDOC/XMLParse.js +292 -0
- data/jsdoc/app/handlers/XMLDOC.js +26 -0
- data/jsdoc/app/lib/JSDOC/DocComment.js +200 -0
- data/jsdoc/app/lib/JSDOC/DocTag.js +294 -0
- data/jsdoc/app/lib/JSDOC/JsDoc.js +180 -0
- data/jsdoc/app/lib/JSDOC/JsPlate.js +100 -0
- data/jsdoc/app/lib/JSDOC/Lang.js +144 -0
- data/jsdoc/app/lib/JSDOC/Parser.js +109 -0
- data/jsdoc/app/lib/JSDOC/PluginManager.js +33 -0
- data/jsdoc/app/lib/JSDOC/Symbol.js +600 -0
- data/jsdoc/app/lib/JSDOC/SymbolSet.js +220 -0
- data/jsdoc/app/lib/JSDOC/TextStream.js +41 -0
- data/jsdoc/app/lib/JSDOC/Token.js +18 -0
- data/jsdoc/app/lib/JSDOC/TokenReader.js +323 -0
- data/jsdoc/app/lib/JSDOC/TokenStream.js +133 -0
- data/jsdoc/app/lib/JSDOC/Util.js +32 -0
- data/jsdoc/app/lib/JSDOC/Walker.js +416 -0
- data/jsdoc/app/lib/JSDOC.js +97 -0
- data/jsdoc/app/main.js +74 -0
- data/jsdoc/app/plugins/commentSrcJson.js +19 -0
- data/jsdoc/app/plugins/frameworkPrototype.js +16 -0
- data/jsdoc/app/plugins/functionCall.js +10 -0
- data/jsdoc/app/plugins/publishSrcHilite.js +62 -0
- data/jsdoc/app/plugins/sproutcoreTags.js +26 -0
- data/jsdoc/app/plugins/symbolLink.js +9 -0
- data/jsdoc/app/plugins/tagParamConfig.js +31 -0
- data/jsdoc/app/plugins/tagSynonyms.js +43 -0
- data/jsdoc/app/run.js +339 -137
- data/jsdoc/changes.txt +47 -0
- data/jsdoc/conf/sample.conf +31 -0
- data/jsdoc/java/build.xml +36 -0
- data/jsdoc/java/build_1.4.xml +36 -0
- data/jsdoc/java/classes/js.jar +0 -0
- data/jsdoc/java/src/JsDebugRun.java +21 -0
- data/jsdoc/java/src/JsRun.java +21 -0
- data/jsdoc/jsdebug.jar +0 -0
- data/jsdoc/jsrun.jar +0 -0
- data/jsdoc/t/TestDoc.js +144 -0
- data/jsdoc/t/runner.js +13 -0
- data/jsdoc/templates/sproutcore/allclasses.tmpl +17 -0
- data/jsdoc/templates/sproutcore/allfiles.tmpl +56 -0
- data/jsdoc/templates/sproutcore/class.tmpl +408 -326
- data/jsdoc/templates/sproutcore/index.tmpl +30 -31
- data/jsdoc/templates/sproutcore/publish.js +173 -81
- data/jsdoc/templates/sproutcore/static/default.css +191 -0
- data/jsdoc/templates/sproutcore/static/header.html +2 -0
- data/jsdoc/templates/sproutcore/static/index.html +19 -0
- data/jsdoc/templates/sproutcore/symbol.tmpl +35 -0
- data/jsdoc/test/addon.js +24 -0
- data/jsdoc/test/anon_inner.js +14 -0
- data/jsdoc/test/augments.js +31 -0
- data/jsdoc/test/augments2.js +26 -0
- data/jsdoc/test/borrows.js +41 -0
- data/jsdoc/test/borrows2.js +23 -0
- data/jsdoc/test/config.js +22 -0
- data/jsdoc/test/constructs.js +18 -0
- data/jsdoc/test/encoding.js +10 -0
- data/jsdoc/test/encoding_other.js +12 -0
- data/jsdoc/test/functions_anon.js +39 -0
- data/jsdoc/test/functions_nested.js +33 -0
- data/jsdoc/test/global.js +13 -0
- data/jsdoc/test/globals.js +25 -0
- data/jsdoc/test/ignore.js +10 -0
- data/jsdoc/test/inner.js +16 -0
- data/jsdoc/test/jsdoc_test.js +477 -0
- data/jsdoc/test/lend.js +33 -0
- data/jsdoc/test/memberof.js +20 -0
- data/jsdoc/test/memberof_constructor.js +15 -0
- data/jsdoc/test/name.js +19 -0
- data/jsdoc/test/namespace_nested.js +23 -0
- data/jsdoc/test/nocode.js +13 -0
- data/jsdoc/test/oblit_anon.js +20 -0
- data/jsdoc/test/overview.js +20 -0
- data/jsdoc/test/param_inline.js +37 -0
- data/jsdoc/test/params_optional.js +8 -0
- data/jsdoc/test/prototype.js +17 -0
- data/jsdoc/test/prototype_nested.js +9 -0
- data/jsdoc/test/prototype_oblit.js +13 -0
- data/jsdoc/test/prototype_oblit_constructor.js +24 -0
- data/jsdoc/test/public.js +10 -0
- data/jsdoc/test/shared.js +42 -0
- data/jsdoc/test/shared2.js +2 -0
- data/jsdoc/test/shortcuts.js +22 -0
- data/jsdoc/test/static_this.js +13 -0
- data/jsdoc/test/synonyms.js +23 -0
- data/jsdoc/test/tosource.js +23 -0
- data/jsdoc/test/variable_redefine.js +14 -0
- data/jsdoc/test.js +304 -0
- data/lib/sproutcore/build_tools/resource_builder.rb +6 -1
- data/lib/sproutcore/bundle_installer.rb +268 -0
- data/lib/sproutcore/jsdoc.rb +7 -6
- data/lib/sproutcore/library.rb +38 -0
- data/lib/sproutcore/merb/bundle_controller.rb +8 -4
- data/lib/sproutcore/version.rb +1 -1
- data/lib/sproutcore.rb +1 -1
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- metadata +117 -29
- data/clients/view_builder/core.js +0 -19
- data/clients/view_builder/english.lproj/body.css +0 -149
- data/clients/view_builder/english.lproj/body.rhtml +0 -18
- data/clients/view_builder/english.lproj/strings.js +0 -14
- data/clients/view_builder/main.js +0 -37
- data/jsdoc/app/DocFile.js +0 -137
- data/jsdoc/app/DocTag.js +0 -110
- data/jsdoc/app/Doclet.js +0 -63
- data/jsdoc/app/Dumper.js +0 -143
- data/jsdoc/app/JsDoc.js +0 -103
- data/jsdoc/app/JsHilite.js +0 -45
- data/jsdoc/app/JsIO.js +0 -163
- data/jsdoc/app/JsParse.js +0 -385
- data/jsdoc/app/JsPlate.js +0 -130
- data/jsdoc/app/JsTestrun.js +0 -129
- data/jsdoc/app/JsToke.js +0 -564
- data/jsdoc/app/Symbol.js +0 -298
- data/jsdoc/app/Transformer.js +0 -14
- data/jsdoc/app/Util.js +0 -97
- data/jsdoc/app/js.jar +0 -0
- data/jsdoc/plugins/min.js +0 -316
- data/jsdoc/plugins/strip.js +0 -20
- data/jsdoc/templates/sproutcore/default.css +0 -191
- data/jsdoc/templates/sproutcore/index.html +0 -13
- data/jsdoc/templates/sproutcore/prototype.js +0 -4186
- data/jsdoc/templates/sproutcore/splash.html +0 -7
@@ -5,6 +5,9 @@
|
|
5
5
|
|
6
6
|
require('core') ;
|
7
7
|
|
8
|
+
SC.URL_ENCODED_FORMAT = 'url-encoded' ;
|
9
|
+
SC.JSON_FORMAT = 'json';
|
10
|
+
|
8
11
|
// The Server object knows how to send requests to the server and how to
|
9
12
|
// get things back from the server. It automatically handles situations
|
10
13
|
// such as 304 caching and queuing requests to send to the server later if
|
@@ -37,6 +40,12 @@ SC.Server = SC.Object.extend({
|
|
37
40
|
// Set this string to the format to be used to set your resource and verb.
|
38
41
|
urlFormat: '/%@/%@',
|
39
42
|
|
43
|
+
// Set this string to either rails or json to set the post transport protocol
|
44
|
+
postFormat: SC.URL_ENCODED_FORMAT,
|
45
|
+
|
46
|
+
// Set this string to true when escaping the JSON string is necessary
|
47
|
+
escapeJSON: true,
|
48
|
+
|
40
49
|
// call this in your main to preload any data sent from the server with the
|
41
50
|
// initial page load.
|
42
51
|
preload: function(clientData) {
|
@@ -189,7 +198,6 @@ SC.Server = SC.Object.extend({
|
|
189
198
|
var recData = server._decamelizeData(rec.getPropertyData()) ;
|
190
199
|
recData._guid = rec._guid ;
|
191
200
|
context[rec._guid] = rec ;
|
192
|
-
rec.set('newRecord',false) ;
|
193
201
|
return recData ;
|
194
202
|
}) ;
|
195
203
|
|
@@ -218,6 +226,7 @@ SC.Server = SC.Object.extend({
|
|
218
226
|
var pk = rec.get('primaryKey') ;
|
219
227
|
var dataKey = (pk == 'guid') ? 'id' : pk.decamelize().toLowerCase().replace(/\-/g,'_') ;
|
220
228
|
rec.set(pk,data[dataKey]) ;
|
229
|
+
rec.set('newRecord',false) ;
|
221
230
|
}
|
222
231
|
}) ;
|
223
232
|
|
@@ -288,20 +297,53 @@ SC.Server = SC.Object.extend({
|
|
288
297
|
|
289
298
|
// collect data for records
|
290
299
|
var server = this ;
|
291
|
-
var data = curRecords.map(function(rec) {
|
292
|
-
return server._decamelizeData(rec.getPropertyData()) ;
|
293
|
-
}) ;
|
294
300
|
|
295
|
-
//
|
296
|
-
this.
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
301
|
+
// start format differences
|
302
|
+
switch(this.get('postFormat')){
|
303
|
+
case SC.URL_ENCODED_FORMAT:
|
304
|
+
var data = curRecords.map(function(rec) {
|
305
|
+
return server._decamelizeData(rec.getPropertyData()) ;
|
306
|
+
}) ;
|
307
|
+
|
308
|
+
// issue request
|
309
|
+
this.request(resource,'update',null,{
|
310
|
+
requestContext: records,
|
311
|
+
onSuccess: this._commitSuccess.bind(this),
|
312
|
+
onFailure: this._commitFailure.bind(this),
|
313
|
+
records: data
|
314
|
+
},'post') ;
|
315
|
+
break;
|
316
|
+
|
317
|
+
case SC.JSON_FORMAT:
|
318
|
+
// get all records and put them into an array
|
319
|
+
var objects = [];
|
320
|
+
for(rec in curRecords){
|
321
|
+
if (!curRecords.hasOwnProperty(rec)) continue ;
|
322
|
+
objects.push(curRecords[rec].get('attributes'));
|
323
|
+
}
|
324
|
+
|
325
|
+
// convert to JSON and escape if this.escapeJSON is true
|
326
|
+
if(this.get('escapeJSON')){
|
327
|
+
var data = escape(objects.toJSONString());
|
328
|
+
} else {
|
329
|
+
var data = objects.toJSONString();
|
330
|
+
}
|
331
|
+
|
332
|
+
// issue request
|
333
|
+
this.request(resource,'update',null,{
|
334
|
+
requestContext: records,
|
335
|
+
onSuccess: this._commitSuccess.bind(this),
|
336
|
+
onFailure: this._commitFailure.bind(this),
|
337
|
+
records: data
|
338
|
+
},'post') ;
|
339
|
+
break;
|
340
|
+
default:
|
341
|
+
break;
|
342
|
+
}
|
343
|
+
// end format differences
|
302
344
|
}
|
303
345
|
},
|
304
|
-
|
346
|
+
|
305
347
|
// This method is called when a refresh is successful. It expects an array
|
306
348
|
// of hashes, which it will convert to records.
|
307
349
|
_commitSuccess: function(status, transport, cacheCode, context) {
|
@@ -369,6 +411,7 @@ SC.Server = SC.Object.extend({
|
|
369
411
|
// their data.
|
370
412
|
refreshRecordsWithData: function(dataAry,recordType,cacheCode,loaded) {
|
371
413
|
var server = this ;
|
414
|
+
|
372
415
|
// first, prepare each data item in the Ary.
|
373
416
|
dataAry = dataAry.map(function(data) {
|
374
417
|
|
@@ -381,16 +424,23 @@ SC.Server = SC.Object.extend({
|
|
381
424
|
// find the recordType
|
382
425
|
if (data.type) {
|
383
426
|
var recordName = data.type.capitalize() ;
|
384
|
-
if (server.prefix)
|
385
|
-
var
|
386
|
-
|
387
|
-
|
427
|
+
if (server.prefix) {
|
428
|
+
for (var prefixLoc = 0; prefixLoc < server.prefix.length; prefixLoc++) {
|
429
|
+
var prefixParts = server.prefix[prefixLoc].split('.');
|
430
|
+
var namespace = window;
|
431
|
+
for (var prefixPartsLoc = 0; prefixPartsLoc < prefixParts.length; prefixPartsLoc++) {
|
432
|
+
var namespace = namespace[prefixParts[prefixPartsLoc]] ;
|
433
|
+
}
|
434
|
+
if (namespace != window) data.recordType = namespace[recordName] ;
|
435
|
+
if (data.recordType) break ;
|
436
|
+
}
|
388
437
|
} else data.recordType = window[recordName] ;
|
438
|
+
|
389
439
|
if (!data.recordType) console.log('skipping undefined recordType:'+recordName) ;
|
390
440
|
} else data.recordType = recordType ;
|
441
|
+
|
391
442
|
if (!data.recordType) return null; // could not process.
|
392
|
-
|
393
|
-
return data ;
|
443
|
+
else return data ;
|
394
444
|
}).compact() ;
|
395
445
|
|
396
446
|
// now update.
|
@@ -150,7 +150,6 @@ Object.extend(String,
|
|
150
150
|
that are defined and use those instead.
|
151
151
|
*/
|
152
152
|
currentLanguage: function () {
|
153
|
-
|
154
153
|
var ret = (this.useAutodetectedLanguage) ? (this.browserLanguage || this.preferredLanguage || 'en') : (this.preferredLanguage || this.browserLanguage || 'en') ;
|
155
154
|
|
156
155
|
// then try a couple of normalized forms...
|
@@ -182,6 +181,7 @@ Object.extend(String,
|
|
182
181
|
break;
|
183
182
|
|
184
183
|
default:
|
184
|
+
ret = "English";
|
185
185
|
break ;
|
186
186
|
}
|
187
187
|
return ret;
|
@@ -21,7 +21,7 @@ SC.window = SC.PaneView.extend({
|
|
21
21
|
while(el && (el != document) && (!el._configured)) el = el.parentNode ;
|
22
22
|
if (el) el = SC.View.findViewForElement(el) ;
|
23
23
|
if (el == this) el = null ;
|
24
|
-
|
24
|
+
return el ;
|
25
25
|
},
|
26
26
|
|
27
27
|
// ........................................................................
|
@@ -223,6 +223,12 @@ SC.window = SC.PaneView.extend({
|
|
223
223
|
{
|
224
224
|
Event.stop(evt);
|
225
225
|
ret = false ;
|
226
|
+
if(this._mouseDownView.mouseDragged && $type(this._mouseDownView.mouseDragged) == T_FUNCTION) {
|
227
|
+
//IE7: if the mouseDownView handles the mouseDragged event, set mouseCanDrag
|
228
|
+
//to true. TODO: make an optional "allowBrowserSelect" property that
|
229
|
+
// would do the same thing; for now let's just prevent it in this case
|
230
|
+
this._mouseCanDrag = true;
|
231
|
+
}
|
226
232
|
}
|
227
233
|
|
228
234
|
SC.runLoop.endRunLoop();
|
@@ -263,10 +269,18 @@ SC.window = SC.PaneView.extend({
|
|
263
269
|
evt._type = 'click';
|
264
270
|
handler = SC.app.sendEvent(evt, this._mouseDownView);
|
265
271
|
}
|
266
|
-
|
272
|
+
this._mouseCanDrag = false;
|
267
273
|
this._mouseDownView = null;
|
268
274
|
SC.runLoop.endRunLoop() ;
|
269
275
|
},
|
276
|
+
|
277
|
+
_ondblclick: function(evt){
|
278
|
+
if(SC.isIE())
|
279
|
+
{
|
280
|
+
this._clickCount = 2;
|
281
|
+
this._onmouseup(evt);
|
282
|
+
}
|
283
|
+
},
|
270
284
|
|
271
285
|
_lastHovered: null,
|
272
286
|
|
@@ -285,6 +299,7 @@ SC.window = SC.PaneView.extend({
|
|
285
299
|
// make sure the view gets focus no matter what. FF is inconsistant
|
286
300
|
// about this.
|
287
301
|
this._onfocus();
|
302
|
+
|
288
303
|
|
289
304
|
var lh = this._lastHovered || [] ;
|
290
305
|
var nh = [] ;
|
@@ -349,38 +364,70 @@ SC.window = SC.PaneView.extend({
|
|
349
364
|
}
|
350
365
|
},
|
351
366
|
|
367
|
+
/** @private */
|
368
|
+
// these methods are used to prevent unnecessary text-selection in IE,
|
369
|
+
// there could be some more work to improve this behavior and make it
|
370
|
+
// a bit more useful; right now it's just to prevent bugs when dragging
|
371
|
+
// and dropping.
|
372
|
+
|
373
|
+
_mouseCanDrag: true,
|
374
|
+
|
375
|
+
_onselectstart: function() {
|
376
|
+
if(this._mouseCanDrag) {
|
377
|
+
return false;
|
378
|
+
} else {
|
379
|
+
return true;
|
380
|
+
}
|
381
|
+
},
|
382
|
+
|
383
|
+
_ondrag: function() {
|
384
|
+
return false;
|
385
|
+
},
|
386
|
+
|
352
387
|
_hasFocus: NO,
|
353
388
|
|
354
|
-
_EVTS: ['mousedown', 'mouseup', 'click', 'dblclick', 'keydown', 'keyup', 'keypress', 'mouseover', 'mouseout', 'mousemove', 'resize', 'unload', 'focus', 'blur'],
|
389
|
+
_EVTS: ['mousedown', 'mouseup', 'click', 'dblclick', 'keydown', 'keyup', 'keypress', 'mouseover', 'mouseout', 'mousemove', 'resize', 'unload', 'focus', 'blur','drag','selectstart'],
|
355
390
|
|
356
391
|
_listenerCache: [],
|
357
392
|
|
358
|
-
setup: function()
|
359
|
-
|
393
|
+
setup: function()
|
394
|
+
{
|
360
395
|
// setup event listeners for window.
|
361
396
|
var win = this ;
|
362
|
-
win._EVTS.each(function(e)
|
397
|
+
win._EVTS.each(function(e)
|
398
|
+
{
|
363
399
|
var func = win['_on' + e] ;
|
364
400
|
var target = (e != 'resize') ? document : window ;
|
365
|
-
if (func)
|
401
|
+
if (func)
|
402
|
+
{
|
366
403
|
var f = func.bindAsEventListener(win) ;
|
367
|
-
|
368
|
-
|
404
|
+
if (e === 'keypress' && SC.CAPTURE_BACKSPACE_KEY && SC.Platform.Firefox > 0)
|
405
|
+
{
|
369
406
|
document.onkeypress = f ;
|
370
|
-
}
|
407
|
+
}
|
408
|
+
else if (e === 'selectstart' && SC.Platform.IE > 0)
|
409
|
+
{
|
410
|
+
//capture onselectstart events in IE (proprietary)
|
411
|
+
document.body.onselectstart = f;
|
412
|
+
}
|
413
|
+
else if (e === 'drag' && SC.Platform.IE > 0)
|
414
|
+
{
|
415
|
+
document.body.ondrag = f;
|
416
|
+
}
|
417
|
+
else
|
418
|
+
{
|
371
419
|
Event.observe(target, e, f) ;
|
372
420
|
}
|
373
|
-
|
374
421
|
win._listenerCache.push([target, e, f]) ;
|
375
422
|
}
|
376
423
|
});
|
377
|
-
|
378
|
-
|
424
|
+
this.get('size') ;
|
425
|
+
// fetch the size from the window and save it.
|
379
426
|
this.set('isVisibleInWindow', true) ;
|
380
427
|
this._onfocus() ;
|
381
|
-
|
382
428
|
}
|
383
|
-
}).viewFor($tag('body')) ;
|
429
|
+
}).viewFor($tag('body')) ;
|
430
|
+
|
384
431
|
|
385
432
|
// events:
|
386
433
|
// window.onfocus --
|
@@ -8,7 +8,8 @@
|
|
8
8
|
# See the comments in this file for more information on what you can
|
9
9
|
# change.
|
10
10
|
-%>
|
11
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
11
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
12
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
12
13
|
<html>
|
13
14
|
<head>
|
14
15
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
@@ -26,8 +27,8 @@
|
|
26
27
|
<%= @content_for_page_styles %>
|
27
28
|
</head>
|
28
29
|
<body class="<%= @theme || 'sc-theme' %> focus">
|
29
|
-
<script>
|
30
|
-
if (
|
30
|
+
<script type="text/javascript">
|
31
|
+
if (SC.setupBodyClassNames) SC.setupBodyClassNames() ;
|
31
32
|
</script>
|
32
33
|
|
33
34
|
<% #
|
@@ -80,12 +80,12 @@ view_helper :menu_item_view, :extends => :button_view do
|
|
80
80
|
@href = nil
|
81
81
|
@inner_html = [
|
82
82
|
%(<a href="#{@my_href}">),
|
83
|
-
'<span class="sel">✓</span>',
|
84
|
-
'<span class="mixed">-</span>',
|
85
83
|
'<span class="inner">',
|
86
84
|
@image,
|
87
85
|
%(<span class="label">#{@label}</span>),
|
88
86
|
'</span>',
|
87
|
+
'<span class="sel">✓</span>',
|
88
|
+
'<span class="mixed">-</span>',
|
89
89
|
%(<span class="shortcut">#{@shortcut}</span>),
|
90
90
|
'</a>'
|
91
91
|
] * ''
|
@@ -6,46 +6,99 @@
|
|
6
6
|
require('models/record') ;
|
7
7
|
require('models/store') ;
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
/**
|
10
|
+
@class
|
11
|
+
@extends SC.Object
|
12
|
+
@since 0.9.14
|
13
|
+
|
14
|
+
@author Charles Jolley
|
15
|
+
|
16
|
+
_IMPORTANT: SC.Collection currently has several known performance issues. It
|
17
|
+
is suitable for use in existing code, but it is possible that the API will
|
18
|
+
change before SproutCore 1.0
|
19
|
+
|
20
|
+
A collection holds a set of records matching the specified conditions. You
|
21
|
+
can set the data source used to find the objects matching the conditions
|
22
|
+
to create collections pulled from the local set of objects or pulled
|
23
|
+
from the server.
|
24
|
+
|
25
|
+
Collection's automatically update their contents based on the conditions
|
26
|
+
settings you provide as the state of loaded records change.
|
27
|
+
*/
|
28
|
+
SC.Collection = SC.Object.extend(
|
29
|
+
/** @scope SC.Collection.prototype */ {
|
18
30
|
|
19
31
|
// ........................................
|
20
32
|
// CONFIGURABLE PROPERTIES
|
21
33
|
//
|
22
34
|
// Set these properties to control the records that will be in this list.
|
23
35
|
|
24
|
-
|
25
|
-
|
36
|
+
/**
|
37
|
+
Indicates the keys to use to order the records. If you want the records
|
38
|
+
ordered by descending order, use a string like 'guid DESC'.
|
39
|
+
|
40
|
+
@type {Array}
|
41
|
+
*/
|
26
42
|
orderBy: ['guid'],
|
27
43
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
44
|
+
/**
|
45
|
+
Set this to the range of records you are interested in seeing or null if
|
46
|
+
you want to see all records. Note that collection actually retrieves
|
47
|
+
a list of records slightly larger than what you pass here to allow for
|
48
|
+
members to be added and removed.
|
49
|
+
|
50
|
+
@see SC.Collection.offset
|
51
|
+
|
52
|
+
@type {Number}
|
53
|
+
*/
|
54
|
+
limit: 0,
|
33
55
|
|
34
|
-
|
35
|
-
|
36
|
-
|
56
|
+
/**
|
57
|
+
Set this to the offset within the range of records you want to retrieve
|
58
|
+
this.get('limit') records from.
|
59
|
+
|
60
|
+
@see SC.Collection.limit
|
61
|
+
|
62
|
+
@type {Number}
|
63
|
+
*/
|
64
|
+
offset: 0,
|
65
|
+
|
66
|
+
/**
|
67
|
+
Set this to a hash with conditions options. e.g. { active: true }. If you
|
68
|
+
don't set this property, then all records of the given type will be
|
69
|
+
used.
|
70
|
+
|
71
|
+
Note also that if you are matching a property that contains an array, the
|
72
|
+
condition will match if the key you specify is found in the array. For
|
73
|
+
example { groups: someGroup } would match any record where someGroup is
|
74
|
+
included in the groups array.
|
75
|
+
|
76
|
+
@type {Object}
|
77
|
+
*/
|
37
78
|
conditions: {},
|
38
79
|
|
39
|
-
|
40
|
-
|
41
|
-
|
80
|
+
/**
|
81
|
+
@property
|
82
|
+
|
83
|
+
This is the actual array of records in the current collection. This
|
84
|
+
property will change anytime the record members change (but not when
|
85
|
+
the member record properties change).
|
86
|
+
|
87
|
+
@type {Array}
|
88
|
+
*/
|
42
89
|
records: function() {
|
43
90
|
if (this._changedRecords) this._flushChangedRecords() ;
|
44
91
|
return this._records ;
|
45
92
|
}.property(),
|
46
93
|
|
47
|
-
|
48
|
-
|
94
|
+
/**
|
95
|
+
@property
|
96
|
+
|
97
|
+
The total count of records matching the conditions settings. The contents
|
98
|
+
of the records array will be clipped to the range value.
|
99
|
+
|
100
|
+
@type {Number}
|
101
|
+
*/
|
49
102
|
count: function(key, value) {
|
50
103
|
if (value !== undefined) {
|
51
104
|
this._count = value ;
|
@@ -53,31 +106,56 @@ SC.Collection = SC.Object.extend({
|
|
53
106
|
return this._count || 0 ;
|
54
107
|
}.property(),
|
55
108
|
|
56
|
-
|
109
|
+
/**
|
110
|
+
Set to true when the collection is destroyed
|
111
|
+
|
112
|
+
@type {Boolean}
|
113
|
+
*/
|
57
114
|
isDeleted: false, // RO
|
58
115
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
116
|
+
/**
|
117
|
+
Set this to the data source you want to use to get the records. Use
|
118
|
+
either SC.Store or SC.Server. If you use SC.Server, your recordType
|
119
|
+
must have a resourceURL property.
|
120
|
+
|
121
|
+
This should be set when the collection is created and not changed later.
|
122
|
+
|
123
|
+
@type {SC.Store or SC.Server}
|
124
|
+
*/
|
125
|
+
dataSource: SC.Store, // NC
|
63
126
|
|
64
|
-
|
65
|
-
|
127
|
+
/**
|
128
|
+
Set this to the type of record you want in the collection.
|
129
|
+
|
130
|
+
This should be set when the collection is created and not changed later.
|
131
|
+
|
132
|
+
@type {SC.Record}
|
133
|
+
*/
|
66
134
|
recordType: SC.Record, // NC
|
67
135
|
|
68
|
-
|
136
|
+
/**
|
137
|
+
Set to true while a refresh is in progress.
|
138
|
+
|
139
|
+
@type {Boolean}
|
140
|
+
*/
|
69
141
|
isLoading: false, // RO
|
70
142
|
|
71
|
-
|
72
|
-
|
143
|
+
/**
|
144
|
+
Set to true if records have changed in a way that might leave the records out
|
145
|
+
of date.
|
146
|
+
|
147
|
+
@type {Boolean}
|
148
|
+
*/
|
73
149
|
isDirty: false, // RO
|
74
150
|
|
75
151
|
// ........................................
|
76
152
|
// ACTIONS
|
77
153
|
//
|
78
154
|
|
79
|
-
|
80
|
-
|
155
|
+
/**
|
156
|
+
Call this to force the list to refresh. The refresh may not happen
|
157
|
+
right away, depending on the dataSource.
|
158
|
+
*/
|
81
159
|
refresh: function() {
|
82
160
|
var recordType = this.get('recordType') || SC.Record ;
|
83
161
|
var offset = (this._limit > 0) ? this._offset : 0 ;
|
@@ -107,11 +185,16 @@ SC.Collection = SC.Object.extend({
|
|
107
185
|
return this;
|
108
186
|
},
|
109
187
|
|
110
|
-
|
111
|
-
|
112
|
-
|
188
|
+
/**
|
189
|
+
Call this method when you are done with a collection. This will remove
|
190
|
+
it as an observer to changes in the SC.Store so that it can be reclaimed.
|
191
|
+
isDeleted will also be set to true.
|
192
|
+
*/
|
113
193
|
destroy: function() { SC.Store.removeCollection(this); return this; },
|
114
194
|
|
195
|
+
/**
|
196
|
+
TODO: Needs documentation.
|
197
|
+
*/
|
115
198
|
newRecord: function(settings) {
|
116
199
|
if (!settings) settings = {} ;
|
117
200
|
settings.newRecord = true ;
|
@@ -258,74 +341,6 @@ SC.Collection = SC.Object.extend({
|
|
258
341
|
this._reslice() ;
|
259
342
|
},
|
260
343
|
|
261
|
-
/// SAVED FOR POSTERITY
|
262
|
-
_oldRecordsDidChange: function() {
|
263
|
-
var state = ((!rec.isDeleted) && rec.matchConditions(this.get('conditions'))) ? 'in' : 'out';
|
264
|
-
var records = this._records ;
|
265
|
-
|
266
|
-
// see if this comes before or after
|
267
|
-
if ((this._limit > 0) && (state == "in") && records && (records.length > 0)) {
|
268
|
-
var order = this.get('orderBy') ;
|
269
|
-
if (rec.compareTo(records[0],order) < 0) {
|
270
|
-
state = "before" ;
|
271
|
-
} else if (rec.compareTo(records[records.length-1],order) > 0) {
|
272
|
-
state = "after" ;
|
273
|
-
}
|
274
|
-
}
|
275
|
-
|
276
|
-
// does this currently belong to the collection.
|
277
|
-
var belongs = records.include(rec) ;
|
278
|
-
var reslice = false ; var refresh = false ;
|
279
|
-
|
280
|
-
// now adjust appropriately
|
281
|
-
switch(state) {
|
282
|
-
case 'before':
|
283
|
-
// note: this is technically incorrect. If the record comes before
|
284
|
-
// that might actually shift everything forward. But there is no
|
285
|
-
// way to really tell if the rec is just now being added or not.
|
286
|
-
//
|
287
|
-
// We let this go since this will only be temporarily wrong as the
|
288
|
-
// list will get refreshed.
|
289
|
-
//
|
290
|
-
if (belongs) { records = records.without(rec) ; reslice = true; }
|
291
|
-
refresh = true ;
|
292
|
-
break ;
|
293
|
-
|
294
|
-
case 'after':
|
295
|
-
case 'out':
|
296
|
-
if (belongs) {
|
297
|
-
records = records.without(rec) ;
|
298
|
-
reslice = refresh = true ;
|
299
|
-
}
|
300
|
-
break ;
|
301
|
-
|
302
|
-
case 'in':
|
303
|
-
// resort records
|
304
|
-
if (!belongs) {
|
305
|
-
records = records.slice();
|
306
|
-
records.push(rec) ;
|
307
|
-
}
|
308
|
-
records = records.sort(function(a,b){ return a.compareTo(b,order); });
|
309
|
-
if (!records.isEqual(this._records)) reslice = refresh = true ;
|
310
|
-
break;
|
311
|
-
}
|
312
|
-
|
313
|
-
if (reslice) {
|
314
|
-
this._records = records ;
|
315
|
-
if (this._limit > 0) {
|
316
|
-
var start = this.get('offset') - this._offset ;
|
317
|
-
var end = start + this.get('limit') ;
|
318
|
-
records = records.slice(start,end) ;
|
319
|
-
}
|
320
|
-
this.set('records',records) ;
|
321
|
-
}
|
322
|
-
|
323
|
-
//if (refresh && !this._refreshing) {
|
324
|
-
// this._refreshing = true ;
|
325
|
-
// this.invokeLater(this.refresh, 1) ;
|
326
|
-
//}
|
327
|
-
},
|
328
|
-
|
329
344
|
// Anytime the properties used to filter the collection change, reslice if possible
|
330
345
|
// then refresh from the data source.
|
331
346
|
propertyObserver: function(observing,target,key,value) {
|
@@ -114,7 +114,7 @@ SC.Record = SC.Object.extend(
|
|
114
114
|
|
115
115
|
init: function()
|
116
116
|
{
|
117
|
-
|
117
|
+
sc_super();
|
118
118
|
|
119
119
|
var primaryKeyName = this.get('primaryKey');
|
120
120
|
if (!this.get(primaryKeyName))
|
@@ -462,7 +462,7 @@ SC.Record = SC.Object.extend(
|
|
462
462
|
if (recValue && recValue.primaryKey) recValue = recValue.get(recValue.primaryKey) ;
|
463
463
|
var stringify = (value instanceof RegExp);
|
464
464
|
if (stringify) {
|
465
|
-
return recValue.toString().match(value)
|
465
|
+
return recValue.toString().match(value) ;
|
466
466
|
} else {
|
467
467
|
return recValue==value ;
|
468
468
|
}
|
@@ -137,7 +137,7 @@ SC.PaneManager = SC.View.extend({
|
|
137
137
|
|
138
138
|
// on init, add to main HTML page if not already added.
|
139
139
|
init: function() {
|
140
|
-
|
140
|
+
sc_super() ;
|
141
141
|
var el = this.rootElement ;
|
142
142
|
if (!this.parentNode) {
|
143
143
|
$tag('body').insertBefore(el, null) ;
|
@@ -115,7 +115,7 @@ SC.OverlayPaneView = SC.PaneView.extend({
|
|
115
115
|
|
116
116
|
keyDown: function(evt) {
|
117
117
|
if (!this.interpretKeyEvents(evt)) {
|
118
|
-
return
|
118
|
+
return sc_super();
|
119
119
|
}
|
120
120
|
},
|
121
121
|
|
@@ -206,7 +206,7 @@ SC.OverlayPaneView = SC.PaneView.extend({
|
|
206
206
|
}.observes('content'),
|
207
207
|
|
208
208
|
init: function() {
|
209
|
-
|
209
|
+
sc_super() ;
|
210
210
|
|
211
211
|
// only Safari does well enough with animations to handle this dainty
|
212
212
|
// guy.
|
@@ -228,7 +228,7 @@ SC.OverlayPaneView = SC.PaneView.extend({
|
|
228
228
|
// view to match its content
|
229
229
|
show: function() {
|
230
230
|
this.containerView._fixWidth();
|
231
|
-
|
231
|
+
sc_super();
|
232
232
|
//this.focusFirstKeyView() ;
|
233
233
|
}
|
234
234
|
|