sproutit-sproutcore 1.0.20090721145281 → 1.0.20090721145282
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/Buildfile +4 -3
- data/VERSION.yml +2 -2
- data/buildtasks/entry.rake +3 -0
- data/buildtasks/manifest.rake +35 -9
- data/buildtasks/target.rake +25 -6
- data/frameworks/sproutcore/Buildfile +10 -0
- data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +41 -20
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +14 -43
- data/frameworks/sproutcore/frameworks/datastore/models/record.js +11 -0
- data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +6 -3
- data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +5 -1
- data/frameworks/sproutcore/frameworks/datastore/system/query.js +10 -7
- data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +19 -20
- data/frameworks/sproutcore/frameworks/datastore/system/store.js +126 -93
- data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +9 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +6 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +28 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +13 -5
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +46 -23
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +29 -5
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +13 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +109 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +69 -15
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +20 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +4 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +56 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +9 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +45 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +0 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +53 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +0 -5
- data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +47 -27
- data/frameworks/sproutcore/frameworks/desktop/system/drag.js +5 -4
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +23 -12
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/render.js +92 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +104 -53
- data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +2 -0
- data/frameworks/sproutcore/frameworks/desktop/views/button.js +4 -3
- data/frameworks/sproutcore/frameworks/desktop/views/collection.js +6 -2
- data/frameworks/sproutcore/frameworks/desktop/views/list.js +9 -0
- data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +9 -1
- data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +80 -102
- data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +0 -1
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/text_field.css +5 -1
- data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +8 -1
- data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +0 -1
- data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +31 -3
- data/frameworks/sproutcore/frameworks/foundation/system/event.js +0 -4
- data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +3 -7
- data/frameworks/sproutcore/frameworks/foundation/system/request.js +3 -4
- data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +78 -17
- data/frameworks/sproutcore/frameworks/foundation/system/utils.js +9 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +5 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +1 -4
- data/frameworks/sproutcore/frameworks/foundation/tests/validators/validator.js +20 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +13 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +132 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +6 -3
- data/frameworks/sproutcore/frameworks/foundation/validators/validator.js +8 -5
- data/frameworks/sproutcore/frameworks/foundation/views/image.js +18 -5
- data/frameworks/sproutcore/frameworks/foundation/views/text_field.js +292 -21
- data/frameworks/sproutcore/frameworks/foundation/views/view.js +13 -14
- data/frameworks/sproutcore/frameworks/mini/license.js +28 -0
- data/frameworks/sproutcore/frameworks/runtime/core.js +35 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +79 -5
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +6 -6
- data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +53 -0
- data/frameworks/sproutcore/frameworks/testing/system/plan.js +4 -0
- data/frameworks/sproutcore/frameworks/testing/system/runner.js +1 -1
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +4 -0
- data/gen/design/Buildfile +23 -0
- data/gen/design/README +1 -0
- data/gen/design/USAGE +10 -0
- data/gen/design/templates/english.lproj/@filename@.js +16 -0
- data/gen/page/Buildfile +36 -0
- data/gen/page/README +1 -0
- data/gen/page/USAGE +15 -0
- data/gen/page/templates/pages/@target_name@/Buildfile +16 -0
- data/gen/page/templates/pages/@target_name@/core.js +22 -0
- data/gen/page/templates/pages/@target_name@/english.lproj/body.css +1 -0
- data/gen/page/templates/pages/@target_name@/english.lproj/body.rhtml +7 -0
- data/gen/page/templates/pages/@target_name@/english.lproj/strings.js +15 -0
- data/gen/view/README +1 -1
- data/gen/view/USAGE +5 -5
- data/lib/sproutcore/builders/base.rb +13 -2
- data/lib/sproutcore/builders/html.rb +28 -1
- data/lib/sproutcore/builders/minify.rb +84 -18
- data/lib/sproutcore/builders/test.rb +2 -1
- data/lib/sproutcore/helpers/entry_sorter.rb +16 -1
- data/lib/sproutcore/helpers/static_helper.rb +32 -4
- data/lib/sproutcore/helpers/tag_helper.rb +65 -0
- data/lib/sproutcore/models/manifest.rb +40 -6
- data/lib/sproutcore/models/target.rb +12 -3
- data/lib/sproutcore/rack/builder.rb +56 -4
- data/lib/sproutcore/tools/manifest.rb +1 -0
- data/lib/sproutcore/tools/server.rb +1 -0
- data/lib/sproutcore/tools.rb +21 -1
- data/lib/sproutcore.rb +13 -0
- metadata +16 -1
@@ -9,6 +9,7 @@
|
|
9
9
|
var MyApp;
|
10
10
|
module("SC.Query querying findAll on a store", {
|
11
11
|
setup: function() {
|
12
|
+
SC.RunLoop.begin();
|
12
13
|
// setup dummy app and store
|
13
14
|
MyApp = SC.Object.create({});
|
14
15
|
|
@@ -44,10 +45,15 @@ module("SC.Query querying findAll on a store", {
|
|
44
45
|
|
45
46
|
// load some data
|
46
47
|
MyApp.DataSource.storeKeys = MyApp.store.loadRecords(MyApp.Foo, records);
|
48
|
+
SC.RunLoop.end();
|
49
|
+
|
50
|
+
SC.RunLoop.begin();
|
47
51
|
// for sanity check, load two record types
|
48
52
|
MyApp.store.loadRecords(MyApp.Faa, records);
|
53
|
+
SC.RunLoop.end();
|
49
54
|
|
50
55
|
}
|
56
|
+
|
51
57
|
});
|
52
58
|
|
53
59
|
|
@@ -56,7 +62,6 @@ module("SC.Query querying findAll on a store", {
|
|
56
62
|
//
|
57
63
|
|
58
64
|
test("should find records based on boolean", function() {
|
59
|
-
|
60
65
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"married=true"});
|
61
66
|
|
62
67
|
var records = MyApp.store.findAll(q);
|
@@ -140,7 +145,7 @@ test("loading more data into the store should propagate to record array", functi
|
|
140
145
|
});
|
141
146
|
|
142
147
|
test("loading more data into the store should propagate to record array with query", function() {
|
143
|
-
|
148
|
+
SC.RunLoop.begin();
|
144
149
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName = 'John'"});
|
145
150
|
|
146
151
|
var records = MyApp.store.findAll(q);
|
@@ -155,16 +160,17 @@ test("loading more data into the store should propagate to record array with que
|
|
155
160
|
// and should fire original SC.Query again
|
156
161
|
|
157
162
|
MyApp.DataSource.storeKeys.replace(0,0,newStoreKeys);
|
158
|
-
|
163
|
+
SC.RunLoop.end();
|
159
164
|
equals(records.get('length'), 2, 'record length after should be 2');
|
160
165
|
|
161
166
|
// subsequent updates to store keys should also work
|
162
|
-
|
167
|
+
SC.RunLoop.begin();
|
163
168
|
var newStoreKeys2 = MyApp.store.loadRecords(MyApp.Foo, [
|
164
169
|
{ guid: 11, firstName: "John", lastName: "Norman" }
|
165
170
|
]);
|
166
171
|
|
167
172
|
MyApp.DataSource.storeKeys.replace(0,0,newStoreKeys2);
|
173
|
+
SC.RunLoop.end();
|
168
174
|
|
169
175
|
equals(records.get('length'), 3, 'record length after should be 3');
|
170
176
|
|
@@ -182,6 +188,7 @@ test("SC.Query returned from fetchRecords() should return result set", function(
|
|
182
188
|
|
183
189
|
test("Loading records after SC.Query is returned in fetchRecords() should show up", function() {
|
184
190
|
|
191
|
+
SC.RunLoop.begin();
|
185
192
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName = 'John'"});
|
186
193
|
|
187
194
|
var records = MyApp.store.findAll(q);
|
@@ -195,6 +202,7 @@ test("Loading records after SC.Query is returned in fetchRecords() should show u
|
|
195
202
|
];
|
196
203
|
|
197
204
|
MyApp.store.loadRecords(MyApp.Foo, recordsToLoad);
|
205
|
+
SC.RunLoop.end();
|
198
206
|
|
199
207
|
equals(records.get('length'), 3, 'record length should be 3');
|
200
208
|
|
@@ -206,6 +214,7 @@ test("Loading records after SC.Query is returned in fetchRecords() should show u
|
|
206
214
|
|
207
215
|
test("Loading records after getting empty record array based on SC.Query should update", function() {
|
208
216
|
|
217
|
+
SC.RunLoop.begin();
|
209
218
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName = 'Maria'"});
|
210
219
|
|
211
220
|
var records = MyApp.store.findAll(q);
|
@@ -216,6 +225,7 @@ test("Loading records after getting empty record array based on SC.Query should
|
|
216
225
|
];
|
217
226
|
|
218
227
|
MyApp.store.loadRecords(MyApp.Foo, recordsToLoad);
|
228
|
+
SC.RunLoop.end();
|
219
229
|
|
220
230
|
equals(records.get('length'), 1, 'record length should be 1');
|
221
231
|
|
@@ -225,6 +235,8 @@ test("Loading records after getting empty record array based on SC.Query should
|
|
225
235
|
|
226
236
|
test("Changing a record should make it show up in RecordArrays based on SC.Query", function() {
|
227
237
|
|
238
|
+
SC.RunLoop.begin();
|
239
|
+
|
228
240
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName = 'Maria'"});
|
229
241
|
|
230
242
|
var records = MyApp.store.findAll(q);
|
@@ -233,6 +245,8 @@ test("Changing a record should make it show up in RecordArrays based on SC.Query
|
|
233
245
|
var record = MyApp.store.find(MyApp.Foo, 1);
|
234
246
|
record.set('firstName', 'Maria');
|
235
247
|
|
248
|
+
SC.RunLoop.end();
|
249
|
+
|
236
250
|
equals(records.get('length'), 1, 'record length should be 1');
|
237
251
|
|
238
252
|
equals(records.objectAt(0).get('firstName'), 'Maria', 'name should be Maria');
|
@@ -241,13 +255,14 @@ test("Changing a record should make it show up in RecordArrays based on SC.Query
|
|
241
255
|
|
242
256
|
test("Deleting a record should make the RecordArray based on SC.Query update accordingly", function() {
|
243
257
|
|
258
|
+
SC.RunLoop.begin();
|
244
259
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName = 'John'"});
|
245
260
|
|
246
261
|
var records = MyApp.store.findAll(q);
|
247
262
|
equals(records.get('length'), 1, 'record length should be 1');
|
248
263
|
|
249
264
|
MyApp.store.destroyRecord(MyApp.Foo, 1);
|
250
|
-
|
265
|
+
SC.RunLoop.end();
|
251
266
|
|
252
267
|
equals(records.get('length'), 0, 'record length should be 0');
|
253
268
|
|
@@ -255,6 +270,7 @@ test("Deleting a record should make the RecordArray based on SC.Query update acc
|
|
255
270
|
|
256
271
|
test("Using findAll with SC.Query on store with no data source should work", function() {
|
257
272
|
|
273
|
+
SC.RunLoop.begin();
|
258
274
|
// create a store with no data source
|
259
275
|
MyApp.store3 = SC.Store.create();
|
260
276
|
|
@@ -268,9 +284,11 @@ test("Using findAll with SC.Query on store with no data source should work", fun
|
|
268
284
|
{ guid: 21, firstName: "John", lastName: "Anderson" },
|
269
285
|
{ guid: 22, firstName: "Barbara", lastName: "Jones" }
|
270
286
|
];
|
271
|
-
|
287
|
+
|
272
288
|
MyApp.store3.loadRecords(MyApp.Foo, recordsToLoad);
|
273
289
|
|
290
|
+
SC.RunLoop.end();
|
291
|
+
|
274
292
|
equals(records.get('length'), 2, 'record length should be 2');
|
275
293
|
|
276
294
|
});
|
@@ -288,6 +306,7 @@ test("Using orderBy in SC.Query returned from findAll()", function() {
|
|
288
306
|
|
289
307
|
test("Using orderBy in SC.Query returned from findAll() and loading more records to original store key array", function() {
|
290
308
|
|
309
|
+
SC.RunLoop.begin();
|
291
310
|
var q = SC.Query.create({recordType: MyApp.Foo, orderBy:"firstName ASC"});
|
292
311
|
|
293
312
|
var records = MyApp.store.findAll(q);
|
@@ -301,6 +320,7 @@ test("Using orderBy in SC.Query returned from findAll() and loading more records
|
|
301
320
|
]);
|
302
321
|
|
303
322
|
MyApp.DataSource.storeKeys.replace(0,0,newStoreKeys2);
|
323
|
+
SC.RunLoop.end();
|
304
324
|
|
305
325
|
equals(records.objectAt(0).get('firstName'), 'Anna', 'name should be Anna');
|
306
326
|
equals(records.objectAt(1).get('firstName'), 'Bert', 'name should be Bert');
|
@@ -311,6 +331,7 @@ test("Using orderBy in SC.Query returned from findAll() and loading more records
|
|
311
331
|
|
312
332
|
test("Using orderBy in SC.Query and loading more records to the store", function() {
|
313
333
|
|
334
|
+
SC.RunLoop.begin();
|
314
335
|
var q = SC.Query.create({recordType: MyApp.Foo, orderBy:"firstName ASC"});
|
315
336
|
|
316
337
|
var records = MyApp.store.findAll(q);
|
@@ -320,6 +341,7 @@ test("Using orderBy in SC.Query and loading more records to the store", function
|
|
320
341
|
MyApp.store.loadRecords(MyApp.Foo, [
|
321
342
|
{ guid: 11, firstName: "Anna", lastName: "Petterson" }
|
322
343
|
]);
|
344
|
+
SC.RunLoop.end();
|
323
345
|
|
324
346
|
equals(records.get('length'), 6, 'record length should be 6');
|
325
347
|
|
@@ -347,6 +369,7 @@ test("Chaining findAll() queries", function() {
|
|
347
369
|
|
348
370
|
test("Chaining findAll() queries and loading more records", function() {
|
349
371
|
|
372
|
+
SC.RunLoop.begin();
|
350
373
|
var q = SC.Query.create({recordType: MyApp.Foo, conditions:"lastName='Doe'"});
|
351
374
|
var q2 = SC.Query.create({recordType: MyApp.Foo, conditions:"firstName='John'"});
|
352
375
|
|
@@ -356,7 +379,34 @@ test("Chaining findAll() queries and loading more records", function() {
|
|
356
379
|
MyApp.store.loadRecords(MyApp.Foo, [
|
357
380
|
{ guid: 11, firstName: "John", lastName: "Doe" }
|
358
381
|
]);
|
382
|
+
SC.RunLoop.end();
|
359
383
|
|
360
384
|
equals(records.get('length'), 2, 'record length should be 2');
|
361
385
|
|
362
386
|
});
|
387
|
+
|
388
|
+
|
389
|
+
module("create record");
|
390
|
+
|
391
|
+
test("creating record appears in future findAll", function() {
|
392
|
+
var Rec = SC.Record.extend({ title: SC.Record.attr(String) });
|
393
|
+
var store = SC.Store.create();
|
394
|
+
SC.run(function() {
|
395
|
+
store.loadRecords(Rec,
|
396
|
+
[{ title: "A", guid: 1 }, { title: "B", guid: 2 }]);
|
397
|
+
});
|
398
|
+
|
399
|
+
equals(store.findAll(Rec).get('length'), 2, 'should have two initial record');
|
400
|
+
|
401
|
+
var r;
|
402
|
+
|
403
|
+
SC.run(function() {
|
404
|
+
store.createRecord(Rec, { title: "C" });
|
405
|
+
r = store.findAll(Rec);
|
406
|
+
equals(r.get('length'), 3, 'should return additional record');
|
407
|
+
});
|
408
|
+
|
409
|
+
r = store.findAll(Rec);
|
410
|
+
equals(r.get('length'), 3, 'should return additional record');
|
411
|
+
|
412
|
+
});
|
@@ -56,6 +56,7 @@ module("SC.Store#commitRecord", {
|
|
56
56
|
bool: YES
|
57
57
|
};
|
58
58
|
|
59
|
+
SC.RunLoop.begin();
|
59
60
|
storeKey1 = SC.Store.generateStoreKey();
|
60
61
|
store.writeDataHash(storeKey1, json1, SC.Record.READY_CLEAN);
|
61
62
|
storeKey2 = SC.Store.generateStoreKey();
|
@@ -70,7 +71,7 @@ module("SC.Store#commitRecord", {
|
|
70
71
|
store.writeDataHash(storeKey6, json6, SC.Record.READY_ERROR);
|
71
72
|
storeKey7 = SC.Store.generateStoreKey();
|
72
73
|
store.writeDataHash(storeKey7, json7, SC.Record.READY_DESTROYED_CLEAN);
|
73
|
-
|
74
|
+
SC.RunLoop.end();
|
74
75
|
}
|
75
76
|
});
|
76
77
|
|
@@ -89,11 +90,15 @@ test("Confirm that all the states are switched as expected after running commitR
|
|
89
90
|
status = store.readStatus( storeKey3);
|
90
91
|
equals(status, SC.Record.BUSY_COMMITTING, "the status should be SC.Record.BUSY_COMMITTING");
|
91
92
|
|
93
|
+
store.dataSourceDidComplete(storeKey3);
|
94
|
+
status = store.readStatus( storeKey3);
|
95
|
+
equals(status, SC.Record.READY_CLEAN, "the status should be SC.Record.READY_CLEAN");
|
96
|
+
|
92
97
|
store.commitRecord(undefined, undefined, storeKey4);
|
93
98
|
status = store.readStatus( storeKey4);
|
94
99
|
equals(status, SC.Record.BUSY_DESTROYING, "the status should be SC.Record.BUSY_DESTROYING");
|
95
100
|
|
96
|
-
try{
|
101
|
+
try {
|
97
102
|
store.commitRecord(undefined, undefined, storeKey5);
|
98
103
|
throwError=false;
|
99
104
|
msg='';
|
@@ -123,4 +128,6 @@ test("Confirm that all the states are switched as expected after running commitR
|
|
123
128
|
}
|
124
129
|
equals(msg, SC.Record.NOT_FOUND_ERROR.message, "commitRecord should throw the following error");
|
125
130
|
|
131
|
+
|
132
|
+
|
126
133
|
});
|
@@ -5,11 +5,17 @@
|
|
5
5
|
// ==========================================================================
|
6
6
|
/*globals module ok equals same test MyApp Sample */
|
7
7
|
|
8
|
-
var store, Application;
|
8
|
+
var store, Application, dataSource;
|
9
9
|
|
10
10
|
module("SC.Store Core Methods", {
|
11
11
|
setup: function() {
|
12
|
-
|
12
|
+
dataSource = SC.DataSource.create({
|
13
|
+
|
14
|
+
gotParams: NO,
|
15
|
+
|
16
|
+
updateRecord: function(store, storeKey, params) {
|
17
|
+
this.gotParams = params && params['param1'] ? YES: NO;
|
18
|
+
}});
|
13
19
|
|
14
20
|
Application = {};
|
15
21
|
|
@@ -35,10 +41,12 @@ module("SC.Store Core Methods", {
|
|
35
41
|
]
|
36
42
|
};
|
37
43
|
|
44
|
+
SC.RunLoop.begin();
|
38
45
|
store = SC.Store.create().from(dataSource);
|
39
46
|
for(var i in Application.Data) {
|
40
47
|
store.loadRecords(Application[i], Application.Data[i]);
|
41
48
|
}
|
49
|
+
SC.RunLoop.end();
|
42
50
|
|
43
51
|
// make sure RecordType by String can map
|
44
52
|
window.Application = Application;
|
@@ -71,3 +79,38 @@ test("find() should take both SC.Record object and SC.Record string as recordtyp
|
|
71
79
|
|
72
80
|
});
|
73
81
|
|
82
|
+
test("loading more records should not sending _flushRecordChanges() until the end of the runloop", function() {
|
83
|
+
|
84
|
+
var moreData = [
|
85
|
+
{ guid: '55', name: 'Home', url: '/emily_parker', isDirectory: true, parent: null, children: 'Collection'},
|
86
|
+
{ guid: '56', name: 'Documents', fileType: 'documents', url: '/emily_parker/Documents', isDirectory: true, parent: '10', children: 'Collection', createdAt: 'June 15, 2007', modifiedAt: 'October 21, 2007', filetype: 'directory', isShared: false},
|
87
|
+
{ guid: '57',name: 'Library', fileType: 'library', url: '/emily_parker/Library', isDirectory: true, parent: '10', children: 'Collection', createdAt: 'June 15, 2007', modifiedAt: 'October 21, 2007', filetype: 'directory', isShared: false}
|
88
|
+
];
|
89
|
+
|
90
|
+
SC.RunLoop.begin();
|
91
|
+
|
92
|
+
var storeKeys = store.loadRecords(Application.File, moreData);
|
93
|
+
equals(storeKeys.length, 3, 'precon - should have loaded three records');
|
94
|
+
equals(store.recordPropertyChanges.storeKeys.length, 3, 'should be three storeKeys in changelog');
|
95
|
+
|
96
|
+
SC.RunLoop.end();
|
97
|
+
|
98
|
+
// recordPropertyChanges may not exist after notifications have gone out.
|
99
|
+
// treat that like having len=0
|
100
|
+
var changes = store.recordPropertyChanges;
|
101
|
+
var len = (changes && changes.storeKeys) ? changes.storeKeys.length : 0;
|
102
|
+
equals(len, 0, 'should be zero storeKeys in changelog');
|
103
|
+
|
104
|
+
});
|
105
|
+
|
106
|
+
test("Passing params through commitRecords()", function() {
|
107
|
+
|
108
|
+
var file = store.find(Application.File, '14');
|
109
|
+
file.set('name', 'My Great New Name');
|
110
|
+
|
111
|
+
store.commitRecords(null, null, null, { param1: 'value1' });
|
112
|
+
|
113
|
+
equals(dataSource.gotParams, YES, 'params should have travelled through to dataSource updateRecord() call');
|
114
|
+
|
115
|
+
|
116
|
+
});
|
@@ -82,20 +82,36 @@ module("SC.Store#retrieveRecord", {
|
|
82
82
|
store.writeDataHash(storeKey8, json8, SC.Record.READY_CLEAN);
|
83
83
|
}
|
84
84
|
});
|
85
|
-
|
86
|
-
|
85
|
+
|
86
|
+
function testStates(canLoad) {
|
87
87
|
var msg, status;
|
88
|
+
|
89
|
+
SC.RunLoop.begin();
|
90
|
+
|
88
91
|
store.retrieveRecord(undefined, undefined, storeKey1, YES);
|
89
92
|
status = store.readStatus( storeKey1);
|
90
|
-
|
93
|
+
if (canLoad) {
|
94
|
+
equals(status, SC.Record.BUSY_LOADING, "the status should have changed to BUSY_LOADING");
|
95
|
+
} else {
|
96
|
+
equals(status, SC.Record.ERROR, "the status should remain empty");
|
97
|
+
}
|
98
|
+
|
91
99
|
|
92
100
|
store.retrieveRecord(undefined, undefined, storeKey2, YES);
|
93
101
|
status = store.readStatus( storeKey2);
|
94
|
-
|
102
|
+
if (canLoad) {
|
103
|
+
equals(status, SC.Record.BUSY_LOADING, "the status should have changed to BUSY_LOADING");
|
104
|
+
} else {
|
105
|
+
equals(status, SC.Record.ERROR, "the status should become empty");
|
106
|
+
}
|
95
107
|
|
96
108
|
store.retrieveRecord(undefined, undefined, storeKey3, YES);
|
97
109
|
status = store.readStatus( storeKey3);
|
98
|
-
|
110
|
+
if (canLoad) {
|
111
|
+
equals(status, SC.Record.BUSY_LOADING, "the status should have changed to BUSY_LOADING");
|
112
|
+
} else {
|
113
|
+
equals(status, SC.Record.ERROR, "the status should become empty");
|
114
|
+
}
|
99
115
|
|
100
116
|
try{
|
101
117
|
store.retrieveRecord(undefined, undefined, storeKey4, YES);
|
@@ -132,6 +148,37 @@ test("Retrieve a record and check for different errors and states", function() {
|
|
132
148
|
|
133
149
|
store.retrieveRecord(undefined, undefined, storeKey8, YES);
|
134
150
|
status = store.readStatus( storeKey8);
|
135
|
-
|
151
|
+
if (canLoad) {
|
152
|
+
ok(SC.Record.BUSY_REFRESH | (status & 0x03), "the status changed to BUSY_REFRESH.");
|
153
|
+
} else {
|
154
|
+
equals(status, SC.Record.READY_CLEAN, "the status should remain ready clean");
|
155
|
+
}
|
136
156
|
|
157
|
+
SC.RunLoop.end();
|
158
|
+
}
|
159
|
+
|
160
|
+
test("Retrieve a record without a data source", function() {
|
161
|
+
testStates(NO);
|
162
|
+
});
|
163
|
+
|
164
|
+
test("Retrieve a record without a working data source and check for different errors and states", function() {
|
165
|
+
// build a fake data source that claims to NOT handle retrieval
|
166
|
+
var source = SC.DataSource.create({
|
167
|
+
retrieveRecords: function() { return NO ; }
|
168
|
+
});
|
169
|
+
store.set('dataSource', source);
|
170
|
+
|
171
|
+
testStates(NO);
|
172
|
+
|
173
|
+
});
|
174
|
+
|
175
|
+
test("Retrieve a record with working data source and check for different errors and states", function() {
|
176
|
+
// build a fake data source that claims to handle retrieval
|
177
|
+
var source = SC.DataSource.create({
|
178
|
+
retrieveRecords: function() { return YES ; }
|
179
|
+
});
|
180
|
+
store.set('dataSource', source);
|
181
|
+
|
182
|
+
testStates(YES);
|
183
|
+
|
137
184
|
});
|
@@ -31,8 +31,9 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
31
31
|
|
32
32
|
@readOnly
|
33
33
|
@type Boolean
|
34
|
+
@default isEnabled
|
34
35
|
*/
|
35
|
-
itemIsEnabledKey:
|
36
|
+
itemIsEnabledKey: "isEnabled",
|
36
37
|
|
37
38
|
/**
|
38
39
|
The key that contains the title for each item. If omitted, no icons will
|
@@ -40,8 +41,9 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
40
41
|
|
41
42
|
@readOnly
|
42
43
|
@type String
|
44
|
+
@default title
|
43
45
|
*/
|
44
|
-
itemTitleKey:
|
46
|
+
itemTitleKey: 'title',
|
45
47
|
|
46
48
|
/**
|
47
49
|
The array of items to display. This can be a simple array of strings,
|
@@ -59,8 +61,9 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
59
61
|
|
60
62
|
@readOnly
|
61
63
|
@type String
|
64
|
+
@default value
|
62
65
|
*/
|
63
|
-
itemValueKey:
|
66
|
+
itemValueKey: 'value',
|
64
67
|
|
65
68
|
/**
|
66
69
|
The key that contains the icon for each item. If omitted, no icons will
|
@@ -68,8 +71,9 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
68
71
|
|
69
72
|
@readOnly
|
70
73
|
@type String
|
74
|
+
@default icon
|
71
75
|
*/
|
72
|
-
itemIconKey:
|
76
|
+
itemIconKey: 'icon',
|
73
77
|
|
74
78
|
/**
|
75
79
|
The width for each menu item and ultimately the menu itself.
|
@@ -97,8 +101,18 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
97
101
|
|
98
102
|
@readOnly
|
99
103
|
@type String
|
104
|
+
@default height
|
100
105
|
*/
|
101
|
-
itemHeightKey:
|
106
|
+
itemHeightKey: 'height',
|
107
|
+
|
108
|
+
/**
|
109
|
+
The submenu for a menu item if any.
|
110
|
+
|
111
|
+
@readOnly
|
112
|
+
@type String
|
113
|
+
@default subMenu
|
114
|
+
*/
|
115
|
+
subMenuKey: 'subMenu',
|
102
116
|
|
103
117
|
/**
|
104
118
|
If YES, titles will be localized before display.
|
@@ -110,56 +124,63 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
110
124
|
|
111
125
|
@readOnly
|
112
126
|
@type Boolean
|
127
|
+
@default separator
|
113
128
|
*/
|
114
|
-
itemSeparatorKey:
|
129
|
+
itemSeparatorKey: 'separator',
|
115
130
|
|
116
131
|
/**
|
117
132
|
This key is need to assign an action to the menu item.
|
118
133
|
|
119
134
|
@readOnly
|
120
135
|
@type String
|
136
|
+
@default action
|
121
137
|
*/
|
122
|
-
itemActionKey:
|
138
|
+
itemActionKey: 'action',
|
123
139
|
|
124
140
|
/**
|
125
141
|
The key for setting a checkbox for the menu item.
|
126
142
|
|
127
143
|
@readOnly
|
128
144
|
@type String
|
145
|
+
@default checkbox
|
129
146
|
*/
|
130
|
-
itemCheckboxKey:
|
147
|
+
itemCheckboxKey: 'checkbox',
|
131
148
|
|
132
149
|
/**
|
133
150
|
The key for setting a branch for the menu item.
|
134
151
|
|
135
152
|
@readOnly
|
136
153
|
@type String
|
154
|
+
@default branchItem
|
137
155
|
*/
|
138
|
-
itemBranchKey:
|
156
|
+
itemBranchKey: 'branchItem',
|
139
157
|
|
140
158
|
/**
|
141
159
|
The key for setting a branch for the menu item.
|
142
160
|
|
143
161
|
@readOnly
|
144
162
|
@type String
|
163
|
+
@default shortcut
|
145
164
|
*/
|
146
|
-
itemShortCutKey:
|
165
|
+
itemShortCutKey: 'shortcut',
|
147
166
|
|
148
167
|
/**
|
149
168
|
The key for setting Key Equivalent for the menu item.
|
150
169
|
|
151
170
|
@readOnly
|
152
171
|
@type String
|
172
|
+
@default keyEquivalent
|
153
173
|
*/
|
154
|
-
itemKeyEquivalentKey:
|
174
|
+
itemKeyEquivalentKey: 'keyEquivalent',
|
155
175
|
|
156
176
|
/**
|
157
177
|
The key for setting Key Equivalent for the menu item.
|
158
178
|
|
159
179
|
@readOnly
|
160
180
|
@type String
|
181
|
+
@default target
|
161
182
|
*/
|
162
|
-
itemTargetKey:
|
183
|
+
itemTargetKey: 'target',
|
163
184
|
|
164
185
|
/** @private */
|
165
186
|
isKeyPane: YES,
|
@@ -270,7 +291,7 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
270
291
|
if (loc && cur[0]) cur[0] = cur[0].loc() ;
|
271
292
|
ret[rel] = SC.Object.create({ title: cur[0], value: cur[1],
|
272
293
|
isEnabled: cur[2], icon: cur[3],
|
273
|
-
isSeparator: cur[4], action: cur[5],
|
294
|
+
isSeparator: cur[4]||NO , action: cur[5],
|
274
295
|
isCheckbox: cur[6], isShortCut: cur[7],
|
275
296
|
menuItemNumber: idx, isBranch: cur[8],
|
276
297
|
itemHeight: cur[9], subMenu: cur[10],
|
@@ -462,7 +483,7 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
462
483
|
*/
|
463
484
|
isAnchorMenuItemType: function() {
|
464
485
|
var anchor = this.get('anchor') ;
|
465
|
-
return (anchor && anchor.kindOf(SC.MenuItemView)) ;
|
486
|
+
return (anchor && anchor.kindOf && anchor.kindOf(SC.MenuItemView)) ;
|
466
487
|
},
|
467
488
|
|
468
489
|
//..........................................................
|
@@ -480,12 +501,11 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
480
501
|
var items, len, menuItems, item, keyEquivalent,
|
481
502
|
action, isEnabled, target;
|
482
503
|
if(!this.get('isEnabled')) return NO ;
|
483
|
-
|
504
|
+
this.displayItems() ;
|
484
505
|
items = this.get('displayItemsArray') ;
|
485
506
|
if (!items) return NO;
|
486
507
|
|
487
508
|
len = items.length ;
|
488
|
-
menuItems = this.get('menuItemViews');
|
489
509
|
for(var idx=0; idx<len; ++idx) {
|
490
510
|
item = items[idx] ;
|
491
511
|
keyEquivalent = item.get('keyEquivalent') ;
|
@@ -493,13 +513,11 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
493
513
|
isEnabled = item.get('isEnabled') ;
|
494
514
|
target = item.get('target') || this ;
|
495
515
|
if(keyEquivalent == keyString && isEnabled) {
|
496
|
-
|
497
|
-
|
498
|
-
return retVal;
|
499
|
-
}
|
516
|
+
var retVal = SC.RootResponder.responder.sendAction(action,target);
|
517
|
+
return retVal;
|
500
518
|
}
|
501
519
|
}
|
502
|
-
return
|
520
|
+
return NO ;
|
503
521
|
},
|
504
522
|
|
505
523
|
//Mouse and Key Events
|
@@ -558,17 +576,18 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
558
576
|
var menuItemViews = this.get('menuItemViews') ;
|
559
577
|
if(menuItemViews) {
|
560
578
|
var len = menuItemViews.length ;
|
561
|
-
var idx = (menuItemViews.indexOf(menuItem) === -1) ?
|
579
|
+
var menuIdx = idx = (menuItemViews.indexOf(menuItem) === -1) ?
|
580
|
+
len : menuItemViews.indexOf(menuItem) ;
|
562
581
|
var isEnabled = NO ;
|
563
582
|
var isSeparator = NO ;
|
564
|
-
while(
|
583
|
+
while((!isEnabled || isSeparator) && --idx !== menuIdx) {
|
584
|
+
if(idx === -1) idx = len - 1;
|
565
585
|
isEnabled = menuItemViews[idx].get('isEnabled') ;
|
566
586
|
var content = menuItemViews[idx].get('content') ;
|
567
587
|
if(content) {
|
568
588
|
isSeparator = content.get(menuItemViews[idx].get('isSeparatorKey'));
|
569
589
|
}
|
570
590
|
}
|
571
|
-
if(idx === -1) idx = len - 1;
|
572
591
|
return menuItemViews[idx];
|
573
592
|
}
|
574
593
|
},
|
@@ -582,17 +601,18 @@ SC.MenuPane = SC.PickerPane.extend(
|
|
582
601
|
var menuItemViews = this.get('menuItemViews') ;
|
583
602
|
if(menuItemViews) {
|
584
603
|
var len = menuItemViews.length ;
|
585
|
-
var idx = (menuItemViews.indexOf(menuItem) === -1) ?
|
604
|
+
var menuIdx = idx = (menuItemViews.indexOf(menuItem) === -1) ?
|
605
|
+
0 : menuItemViews.indexOf(menuItem) ;
|
586
606
|
var isEnabled = NO ;
|
587
607
|
var isSeparator = NO ;
|
588
|
-
while(!isEnabled
|
608
|
+
while((!isEnabled || isSeparator) && ++idx !== menuIdx) {
|
609
|
+
if(idx === len) idx = 0;
|
589
610
|
isEnabled = menuItemViews[idx].get('isEnabled') ;
|
590
611
|
var content = menuItemViews[idx].get('content') ;
|
591
612
|
if(content) {
|
592
613
|
isSeparator = content.get(menuItemViews[idx].get('isSeparatorKey'));
|
593
614
|
}
|
594
615
|
}
|
595
|
-
if(idx === len) idx = 0 ;
|
596
616
|
return menuItemViews[idx] ;
|
597
617
|
}
|
598
618
|
},
|
@@ -334,9 +334,9 @@ SC.Drag = SC.Object.extend(
|
|
334
334
|
return ; // quickly ignore duplicate calls
|
335
335
|
}
|
336
336
|
|
337
|
-
//
|
338
|
-
|
339
|
-
this.set('location',
|
337
|
+
// save the new location to avoid duplicate mouseDragged event processing
|
338
|
+
loc = { x: evt.pageX, y: evt.pageY };
|
339
|
+
this.set('location', loc) ;
|
340
340
|
|
341
341
|
// STEP 1: Determine the deepest drop target that allows an operation.
|
342
342
|
// if the drop target selected the last time this method was called
|
@@ -543,7 +543,8 @@ SC.Drag = SC.Object.extend(
|
|
543
543
|
for (var idx=0, len=ary.length; idx<len; idx++) {
|
544
544
|
target = ary[idx] ;
|
545
545
|
|
546
|
-
//
|
546
|
+
// If the target is not visible, it is not valid.
|
547
|
+
if (!target.get('isVisibleInWindow')) continue ;
|
547
548
|
|
548
549
|
// get clippingFrame, converted to the pane.
|
549
550
|
frame = target.convertFrameToView(target.get('clippingFrame'), null) ;
|