js_stack 0.6.6 → 0.6.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0dcceebc2926ab5718deddb7b0bb3e3cf4a1978
4
- data.tar.gz: adab6aa7d4761327410ee0b357a1f92166148472
3
+ metadata.gz: bcee6f489f0b24c8b69b1eac5dec1b29be4f7484
4
+ data.tar.gz: ce93f0127c785c3d511fb012099e4c75ff122637
5
5
  SHA512:
6
- metadata.gz: ebe1299e17fb0713b35ca2954c62b568c9687ec86015c4b585276228ea22d519b5850678a8d0b0c4d315c43f84d99c8c988b115661ddb99ccfbbc740f249a8b0
7
- data.tar.gz: c0935cab75cb7b3148ab49c49d1ad16beff75eac4e9635f3037f34af17aab9614116da7c987178a2d3d29aaf26f5be9d153a788ed3e09ed2cace7103af3d0fc1
6
+ metadata.gz: 0a4cf05e07abc47e36a01c25aa2d15d1ea533ad84d37a1d129f1ee983f805874df33f72dce9f749c250624431cef5b90848d54072ef6f378b8d6245b58ab5d6d
7
+ data.tar.gz: 1a1b808931ae8919670a58b211f92ce94dc427f3ddd6d870a73f8392be6dc2f7ec399d4bff46ae5f61b7268831c00c748c7998c5d50ee5ab288553d8e1dd2dfa
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ # 0.6.7
4
+
5
+ * update backbone.associations 0.6.1 -> 0.6.2 [@gvl]
6
+ * update backbone.paginator 2.0.0 -> 2.0.1 [@gvl]
7
+ * update cocktail 0.5.3 -> 0.5.8 [@gvl]
8
+
3
9
  # 0.6.6
4
10
 
5
11
  * update marionette 1.8.8 -> 2.0.1 [@gvl]
data/README.md CHANGED
@@ -62,16 +62,16 @@ Examples:
62
62
 
63
63
  | Library | Versions | Changelog | Homepage | Default |
64
64
  | :-----: | :------: | :-------: | :------: | :-----: |
65
- | backbone associations | **0.6.1**, 0.5.5 | [changelog](https://github.com/dhruvaray/backbone-associations/blob/master/CHANGELOG.md) | [homepage](http://dhruvaray.github.io/backbone-associations/) | Yes
65
+ | backbone associations | **0.6.2**, 0.5.5 | [changelog](https://github.com/dhruvaray/backbone-associations/blob/master/CHANGELOG.md) | [homepage](http://dhruvaray.github.io/backbone-associations/) | Yes
66
66
  | backbone deepmodel | **0.10.4** | [changelog](https://github.com/powmedia/backbone-deep-model#changelog) | [homepage](https://github.com/powmedia/backbone-deep-model) | Yes
67
67
  | backbone mutators | **0.4.2** | [changelog](https://github.com/asciidisco/Backbone.Mutators#changelog) | [homepage](https://github.com/asciidisco/Backbone.Mutators) | No
68
68
  | backbone pageable | **1.4.8**, 1.3.2 | [changelog](https://github.com/backbone-paginator/backbone-pageable#change-log) | [homepage](https://github.com/wyuenho/backbone-pageable) | Yes
69
- | backbone paginator | **2.0.0** | [changelog](https://github.com/backbone-paginator/backbone.paginator/wiki/Changelog) | [homepage](https://github.com/backbone-paginator/backbone.paginator) | No
69
+ | backbone paginator | **2.0.1** | [changelog](https://github.com/backbone-paginator/backbone.paginator/wiki/Changelog) | [homepage](https://github.com/backbone-paginator/backbone.paginator) | No
70
70
  | backbone routefilter | **0.2.1** | [changelog](https://github.com/boazsender/backbone.routefilter#release-history) | [homepage](https://github.com/boazsender/backbone.routefilter) | No
71
71
  | backbone stickit | **0.8.0**, 0.7.0, 0.6.3 | [changelog](http://nytimes.github.io/backbone.stickit/#change-log) | [homepage](http://nytimes.github.io/backbone.stickit/) | Yes
72
72
  | backbone validation | **0.9.1**, 0.8.1 | [changelog](https://github.com/thedersen/backbone.validation#release-notes) | [homepage](https://github.com/thedersen/backbone.validation) | Yes
73
73
  | backbone virtualcollection | **0.4.15** | [changelog](https://github.com/p3drosola/Backbone.VirtualCollection#changelog) | [homepage](https://github.com/p3drosola/Backbone.VirtualCollection) | Yes
74
- | cocktail | **0.5.3** | none | [homepage](https://github.com/onsi/cocktail) | No
74
+ | cocktail | **0.5.8** | none | [homepage](https://github.com/onsi/cocktail) | No
75
75
  | momentjs | **2.7.0** | [changelog](https://github.com/moment/moment/#changelog) | [homepage](https://github.com/derekprior/momentjs-rails) | No
76
76
  | underscore inflections | **0.2.1** | none | [homepage](https://github.com/geetarista/underscore.inflections) | No
77
77
  | underscore string | **2.3.2** | [changelog](https://github.com/epeli/underscore.string#changelog) | [homepage](http://epeli.github.io/underscore.string/) | No
@@ -1,3 +1,3 @@
1
1
  module JsStack
2
- VERSION = '0.6.6'
2
+ VERSION = '0.6.7'
3
3
  end
@@ -1,7 +1,7 @@
1
1
  //
2
- // Backbone-associations.js 0.6.1
2
+ // Backbone-associations.js 0.6.2
3
3
  //
4
- // (c) 2013 Dhruva Ray, Jaynti Kanani, Persistent Systems Ltd.
4
+ // (c) 2014 Dhruva Ray, Jaynti Kanani, Persistent Systems Ltd.
5
5
  // Backbone-associations may be freely distributed under the MIT license.
6
6
  // For all details and documentation:
7
7
  // https://github.com/dhruvaray/backbone-associations/
@@ -51,7 +51,7 @@
51
51
  BackboneEvent = Backbone.Events;
52
52
 
53
53
  Backbone.Associations = {
54
- VERSION: "0.6.1"
54
+ VERSION: "0.6.2"
55
55
  };
56
56
 
57
57
  // Alternative scopes other than root
@@ -108,6 +108,13 @@
108
108
  // and prevent redundant event to be triggered in case of cyclic model graphs.
109
109
  _proxyCalls:undefined,
110
110
 
111
+ // Override constructor to set parents
112
+ constructor: function (attributes, options) {
113
+ // Set parent's opportunistically.
114
+ options && options.__parents__ && (this.parents = [options.__parents__]);
115
+ BackboneModel.apply(this, arguments);
116
+ },
117
+
111
118
  on: function (name, callback, context) {
112
119
 
113
120
  var result = BackboneEvent.on.apply(this, arguments);
@@ -169,8 +176,10 @@
169
176
 
170
177
  // Get the value of an attribute.
171
178
  get:function (attr) {
172
- var obj = ModelProto.get.call(this, attr);
173
- return obj ? obj : this._getAttr.apply(this, arguments);
179
+ var cache = this.__attributes__,
180
+ val = ModelProto.get.call(this, attr),
181
+ obj = cache ? (isValuePresent(val) ? val : cache[attr]) : val;
182
+ return isValuePresent(obj) ? obj : this._getAttr.apply(this, arguments);
174
183
  },
175
184
 
176
185
  // Set a hash of model attributes on the Backbone Model.
@@ -196,6 +205,10 @@
196
205
  _set:function (attributes, options) {
197
206
  var attr, modelMap, modelId, obj, result = this;
198
207
  if (!attributes) return this;
208
+
209
+ // temp cache of attributes
210
+ this.__attributes__ = attributes;
211
+
199
212
  for (attr in attributes) {
200
213
  //Create a map for each unique object whose attributes we want to set
201
214
  modelMap || (modelMap = {});
@@ -203,8 +216,9 @@
203
216
  var pathTokens = getPathArray(attr), initials = _.initial(pathTokens),
204
217
  last = pathTokens[pathTokens.length - 1],
205
218
  parentModel = this.get(initials);
206
- if (parentModel instanceof AssociatedModel) {
207
- obj = modelMap[parentModel.cid] || (modelMap[parentModel.cid] = {'model':parentModel, 'data':{}});
219
+ if (parentModel instanceof BackboneModel) {
220
+ obj = modelMap[parentModel.cid] ||
221
+ (modelMap[parentModel.cid] = {'model': parentModel, 'data': {}});
208
222
  obj.data[last] = attributes[attr];
209
223
  }
210
224
  } else {
@@ -222,6 +236,9 @@
222
236
  } else {
223
237
  result = this._setAttr.call(this, attributes, options);
224
238
  }
239
+
240
+ delete this.__attributes__;
241
+
225
242
  return result;
226
243
 
227
244
  },
@@ -242,108 +259,90 @@
242
259
  // if `relations` are available.
243
260
  _.each(this.relations, function (relation) {
244
261
  var relationKey = relation.key,
245
- relatedModel = relation.relatedModel,
246
- collectionType = relation.collectionType,
247
262
  activationContext = relation.scope || root,
248
- map = relation.map,
263
+ relatedModel = this._transformRelatedModel(relation, attributes),
264
+ collectionType = this._transformCollectionType(relation, relatedModel, attributes),
265
+ map = _.isString(relation.map) ? map2Scope(relation.map, activationContext) : relation.map,
249
266
  currVal = this.attributes[relationKey],
250
267
  idKey = currVal && currVal.idAttribute,
251
268
  val, relationOptions, data, relationValue, newCtx = false;
252
269
 
253
- // Call function if relatedModel is implemented as a function
254
- if (relatedModel && !(relatedModel.prototype instanceof BackboneModel))
255
- relatedModel = _.isFunction(relatedModel) ?
256
- relatedModel.call(this, relation, attributes) :
257
- relatedModel;
258
-
259
- // Get class if relation and map is stored as a string.
260
- if (relatedModel && _.isString(relatedModel)) {
261
- relatedModel = (relatedModel === Backbone.Self) ?
262
- this.constructor :
263
- map2Scope(relatedModel, activationContext);
264
- }
265
-
266
- map && _.isString(map) && (map = map2Scope(map, activationContext));
267
270
  // Merge in `options` specific to this relation.
268
271
  relationOptions = relation.options ? _.extend({}, relation.options, options) : options;
269
272
 
270
273
  if (attributes[relationKey]) {
274
+
271
275
  // Get value of attribute with relation key in `val`.
272
276
  val = _.result(attributes, relationKey);
277
+
273
278
  // Map `val` if a transformation function is provided.
274
279
  val = map ? map.call(this, val, collectionType ? collectionType : relatedModel) : val;
280
+ if (!isValuePresent(val)) {
281
+ data = val;
282
+ } else {
283
+ // If `relation.type` is `Backbone.Many`,
284
+ // Create `Backbone.Collection` with passed data and perform Backbone `set`.
285
+ if (relation.type === Backbone.Many) {
275
286
 
276
- // If `relation.type` is `Backbone.Many`,
277
- // Create `Backbone.Collection` with passed data and perform Backbone `set`.
278
- if (relation.type === Backbone.Many) {
279
-
280
- if (collectionType && _.isFunction(collectionType) &&
281
- (collectionType.prototype instanceof BackboneModel))
282
- throw new Error('type is of Backbone.Model. Specify derivatives of Backbone.Collection');
283
-
284
- // Call function if collectionType is implemented as a function
285
- if (collectionType && !(collectionType.prototype instanceof BackboneCollection))
286
- collectionType = _.isFunction(collectionType) ?
287
- collectionType.call(this, relation, attributes) : collectionType;
288
-
289
- collectionType && _.isString(collectionType) &&
290
- (collectionType = map2Scope(collectionType, activationContext));
291
-
292
- if ((!relatedModel) && (!collectionType))
293
- throw new Error('specify either a relatedModel or collectionType');
294
-
295
- // `collectionType` of defined `relation` should be instance of `Backbone.Collection`.
296
- if (collectionType && !collectionType.prototype instanceof BackboneCollection) {
297
- throw new Error('collectionType must inherit from Backbone.Collection');
298
- }
299
-
300
- if (currVal) {
301
- // Setting this flag will prevent events from firing immediately. That way clients
302
- // will not get events until the entire object graph is updated.
303
- currVal._deferEvents = true;
304
-
305
- // Use Backbone.Collection's `reset` or smart `set` method
306
- currVal[relationOptions.reset ? 'reset' : 'set'](
307
- val instanceof BackboneCollection ? val.models : val, relationOptions);
287
+ if (currVal) {
288
+ // Setting this flag will prevent events from firing immediately. That way clients
289
+ // will not get events until the entire object graph is updated.
290
+ currVal._deferEvents = true;
308
291
 
309
- data = currVal;
292
+ // Use Backbone.Collection's `reset` or smart `set` method
293
+ currVal[relationOptions.reset ? 'reset' : 'set'](
294
+ val instanceof BackboneCollection ? val.models : val, relationOptions);
310
295
 
311
- } else {
312
- newCtx = true;
296
+ data = currVal;
313
297
 
314
- if (val instanceof BackboneCollection) {
315
- data = val;
316
298
  } else {
317
- data = collectionType ?
318
- new collectionType() : this._createCollection(relatedModel, activationContext);
319
- data[relationOptions.reset ? 'reset' : 'set'](val, relationOptions);
299
+ newCtx = true;
300
+
301
+ if (val instanceof BackboneCollection) {
302
+ data = val;
303
+ } else {
304
+ data = this._createCollection(
305
+ collectionType || BackboneCollection,
306
+ relation.collectionOptions || (relatedModel ? {model: relatedModel} : {})
307
+ );
308
+ data[relationOptions.reset ? 'reset' : 'set'](val, relationOptions);
309
+ }
320
310
  }
321
- }
322
311
 
323
- } else if (relation.type === Backbone.One) {
324
-
325
- if (!relatedModel)
326
- throw new Error('specify a relatedModel for Backbone.One type');
312
+ } else if (relation.type === Backbone.One) {
313
+
314
+ var hasOwnProperty = (val instanceof BackboneModel) ?
315
+ val.attributes.hasOwnProperty(idKey) :
316
+ val.hasOwnProperty(idKey);
317
+ var newIdKey = (val instanceof BackboneModel) ?
318
+ val.attributes[idKey] :
319
+ val[idKey];
320
+
321
+ //Is the passed in data for the same key?
322
+ if (currVal && hasOwnProperty &&
323
+ currVal.attributes[idKey] === newIdKey) {
324
+ // Setting this flag will prevent events from firing immediately. That way clients
325
+ // will not get events until the entire object graph is updated.
326
+ currVal._deferEvents = true;
327
+ // Perform the traditional `set` operation
328
+ currVal._set(val instanceof BackboneModel ? val.attributes : val, relationOptions);
329
+ data = currVal;
330
+ } else {
331
+ newCtx = true;
327
332
 
328
- if (!(relatedModel.prototype instanceof Backbone.AssociatedModel))
329
- throw new Error('specify an AssociatedModel for Backbone.One type');
333
+ if (val instanceof BackboneModel) {
334
+ data = val;
335
+ } else {
336
+ relationOptions.__parents__ = this;
337
+ data = new relatedModel(val, relationOptions);
338
+ delete relationOptions.__parents__;
339
+ }
330
340
 
331
- data = val instanceof AssociatedModel ? val : new relatedModel(val, relationOptions);
332
- //Is the passed in data for the same key?
333
- if (currVal && data.attributes[idKey] &&
334
- currVal.attributes[idKey] === data.attributes[idKey]) {
335
- // Setting this flag will prevent events from firing immediately. That way clients
336
- // will not get events until the entire object graph is updated.
337
- currVal._deferEvents = true;
338
- // Perform the traditional `set` operation
339
- currVal._set(val instanceof AssociatedModel ? val.attributes : val, relationOptions);
340
- data = currVal;
341
+ }
341
342
  } else {
342
- newCtx = true;
343
+ throw new Error('type attribute must be specified and ' +
344
+ 'have the values Backbone.One or Backbone.Many');
343
345
  }
344
-
345
- } else {
346
- throw new Error('type attribute must be specified and have the values Backbone.One or Backbone.Many');
347
346
  }
348
347
 
349
348
 
@@ -353,28 +352,19 @@
353
352
  // Add proxy events to respective parents.
354
353
  // Only add callback if not defined or new Ctx has been identified.
355
354
  if (newCtx || (relationValue && !relationValue._proxyCallback)) {
356
- relationValue._proxyCallback = function () {
357
- return Backbone.Associations.EVENTS_BUBBLE &&
358
- this._bubbleEvent.call(this, relationKey, relationValue, arguments);
359
- };
355
+ if(!relationValue._proxyCallback) {
356
+ relationValue._proxyCallback = function () {
357
+ return Backbone.Associations.EVENTS_BUBBLE &&
358
+ this._bubbleEvent.call(this, relationKey, relationValue, arguments);
359
+ };
360
+ }
360
361
  relationValue.on("all", relationValue._proxyCallback, this);
361
362
  }
362
363
 
363
364
  }
364
365
  //Distinguish between the value of undefined versus a set no-op
365
- if (attributes.hasOwnProperty(relationKey)) {
366
- //Maintain reverse pointers - a.k.a parents
367
- var updated = attributes[relationKey];
368
- var original = this.attributes[relationKey];
369
- if (updated) {
370
- updated.parents = updated.parents || [];
371
- (_.indexOf(updated.parents, this) == -1) && updated.parents.push(this);
372
- } else if (original && original.parents.length > 0) { // New value is undefined
373
- original.parents = _.difference(original.parents, [this]);
374
- // Don't bubble to this parent anymore
375
- original._proxyCallback && original.off("all", original._proxyCallback, this);
376
- }
377
- }
366
+ if (attributes.hasOwnProperty(relationKey))
367
+ this._setupParents(attributes[relationKey], this.attributes[relationKey]);
378
368
  }, this);
379
369
  }
380
370
  // Return results for `BackboneModel.set`.
@@ -484,18 +474,27 @@
484
474
  });
485
475
  },
486
476
 
487
- // Returns New `collection` of type `relation.relatedModel`.
488
- _createCollection: function (type, context) {
489
- var collection, relatedModel = type;
490
- _.isString(relatedModel) && (relatedModel = map2Scope(relatedModel, context));
491
- // Creates new `Backbone.Collection` and defines model class.
492
- if (relatedModel && (relatedModel.prototype instanceof AssociatedModel) || _.isFunction(relatedModel)) {
493
- collection = new BackboneCollection();
494
- collection.model = relatedModel;
495
- } else {
496
- throw new Error('type must inherit from Backbone.AssociatedModel');
477
+ //Maintain reverse pointers - a.k.a parents
478
+ _setupParents: function (updated, original) {
479
+ // Set new parent for updated
480
+ if (updated) {
481
+ updated.parents = updated.parents || [];
482
+ (_.indexOf(updated.parents, this) == -1) && updated.parents.push(this);
483
+ }
484
+ // Remove `this` from the earlier set value's parents (if the new value is different).
485
+ if (original && original.parents.length > 0 && original != updated) {
486
+ original.parents = _.difference(original.parents, [this]);
487
+ // Don't bubble to this parent anymore
488
+ original._proxyCallback && original.off("all", original._proxyCallback, this);
497
489
  }
498
- return collection;
490
+ },
491
+
492
+ // Returns new `collection` (or derivatives) of type `options.model`.
493
+ _createCollection: function (type, options) {
494
+ options = _.defaults(options, {model: type.model});
495
+ var c = new type([], _.isFunction(options) ? options.call(this) : options);
496
+ c.parents = [this];
497
+ return c;
499
498
  },
500
499
 
501
500
  // Process all pending events after the entire object graph has been updated
@@ -515,13 +514,78 @@
515
514
  // Traverse down the object graph and call process pending events on sub-trees
516
515
  _.each(this.relations, function (relation) {
517
516
  var val = this.attributes[relation.key];
518
- val && val._processPendingEvents();
517
+ val && val._processPendingEvents && val._processPendingEvents();
519
518
  }, this);
520
519
 
521
520
  delete this._processedEvents;
522
521
  }
523
522
  },
524
523
 
524
+ // Process the raw `relatedModel` value set in a relation
525
+ _transformRelatedModel: function (relation, attributes) {
526
+
527
+ var relatedModel = relation.relatedModel;
528
+ var activationContext = relation.scope || root;
529
+
530
+ // Call function if relatedModel is implemented as a function
531
+ if (relatedModel && !(relatedModel.prototype instanceof BackboneModel))
532
+ relatedModel = _.isFunction(relatedModel) ?
533
+ relatedModel.call(this, relation, attributes) :
534
+ relatedModel;
535
+
536
+ // Get class if relation and map is stored as a string.
537
+ if (relatedModel && _.isString(relatedModel)) {
538
+ relatedModel = (relatedModel === Backbone.Self) ?
539
+ this.constructor :
540
+ map2Scope(relatedModel, activationContext);
541
+ }
542
+
543
+ // Error checking
544
+ if (relation.type === Backbone.One) {
545
+
546
+ if (!relatedModel)
547
+ throw new Error('specify a relatedModel for Backbone.One type');
548
+
549
+ if (!(relatedModel.prototype instanceof Backbone.Model))
550
+ throw new Error('specify an AssociatedModel or Backbone.Model for Backbone.One type');
551
+ }
552
+
553
+ return relatedModel;
554
+ },
555
+
556
+ // Process the raw `collectionType` value set in a relation
557
+ _transformCollectionType: function (relation, relatedModel, attributes) {
558
+
559
+ var collectionType = relation.collectionType;
560
+ var activationContext = relation.scope || root;
561
+
562
+ if (collectionType && _.isFunction(collectionType) &&
563
+ (collectionType.prototype instanceof BackboneModel))
564
+ throw new Error('type is of Backbone.Model. Specify derivatives of Backbone.Collection');
565
+
566
+ // Call function if collectionType is implemented as a function
567
+ if (collectionType && !(collectionType.prototype instanceof BackboneCollection))
568
+ collectionType = _.isFunction(collectionType) ?
569
+ collectionType.call(this, relation, attributes) : collectionType;
570
+
571
+ collectionType && _.isString(collectionType) &&
572
+ (collectionType = map2Scope(collectionType, activationContext));
573
+
574
+ // `collectionType` of defined `relation` should be instance of `Backbone.Collection`.
575
+ if (collectionType && !collectionType.prototype instanceof BackboneCollection) {
576
+ throw new Error('collectionType must inherit from Backbone.Collection');
577
+ }
578
+
579
+ // Error checking
580
+ if (relation.type === Backbone.Many) {
581
+ if ((!relatedModel) && (!collectionType))
582
+ throw new Error('specify either a relatedModel or collectionType');
583
+ }
584
+
585
+ return collectionType;
586
+
587
+ },
588
+
525
589
  // Override trigger to defer events in the object graph.
526
590
  trigger:function (name) {
527
591
  // Defer event processing
@@ -555,7 +619,8 @@
555
619
  remoteKey = relation.remoteKey,
556
620
  attr = this.attributes[key],
557
621
  serialize = !relation.isTransient,
558
- serialize_keys = relation.serialize || []
622
+ serialize_keys = relation.serialize || [],
623
+ _options = _.clone(options);
559
624
 
560
625
  // Remove default Backbone serialization for associations.
561
626
  delete json[key];
@@ -566,12 +631,12 @@
566
631
 
567
632
  // Pass the keys to serialize as options to the toJSON method.
568
633
  if (serialize_keys.length) {
569
- options ?
570
- (options.serialize_keys = serialize_keys) :
571
- (options = {serialize_keys: serialize_keys})
634
+ _options ?
635
+ (_options.serialize_keys = serialize_keys) :
636
+ (_options = {serialize_keys: serialize_keys})
572
637
  }
573
638
 
574
- aJson = attr && attr.toJSON ? attr.toJSON(options) : attr;
639
+ aJson = attr && attr.toJSON ? attr.toJSON(_options) : attr;
575
640
  json[remoteKey || key] = _.isArray(aJson) ? _.compact(aJson) : aJson;
576
641
  }
577
642
 
@@ -591,18 +656,51 @@
591
656
  // Call this if you want to set an `AssociatedModel` to a falsy value like undefined/null directly.
592
657
  // Not calling this will leak memory and have wrong parents.
593
658
  // See test case "parent relations"
594
- cleanup:function () {
659
+ cleanup:function (options) {
660
+ options = options || {};
661
+
595
662
  _.each(this.relations, function (relation) {
596
663
  var val = this.attributes[relation.key];
597
- val && (val.parents = _.difference(val.parents, [this]));
664
+ if(val) {
665
+ val._proxyCallback && val.off("all", val._proxyCallback, this);
666
+ val.parents = _.difference(val.parents, [this]);
667
+ }
598
668
  }, this);
599
- this.off();
669
+
670
+ (!options.listen) && this.off();
671
+ },
672
+
673
+ // Override destroy to perform house-keeping on `parents` collection
674
+ destroy: function(options) {
675
+ options = options ? _.clone(options) : {};
676
+ options = _.defaults(options, {remove_references: true, listen: true});
677
+ var model = this;
678
+
679
+ if(options.remove_references && options.wait) {
680
+ // Proxy success implementation
681
+ var success = options.success;
682
+
683
+ // Substitute with an implementation which will remove references to `model`
684
+ options.success = function (resp) {
685
+ if (success) success(model, resp, options);
686
+ model.cleanup(options);
687
+ }
688
+ }
689
+ // Call the base implementation
690
+ var xhr = ModelProto.destroy.apply(this, [options]);
691
+
692
+ if(options.remove_references && !options.wait) {
693
+ model.cleanup(options);
694
+ }
695
+
696
+ return xhr;
600
697
  },
601
698
 
602
699
  // Navigate the path to the leaf object in the path to query for the attribute value
603
700
  _getAttr:function (path) {
604
701
 
605
702
  var result = this,
703
+ cache = this.__attributes__,
606
704
  //Tokenize the path
607
705
  attrs = getPathArray(path),
608
706
  key,
@@ -614,7 +712,10 @@
614
712
  //Navigate the path to get to the result
615
713
  result = result instanceof BackboneCollection
616
714
  ? (isNaN(key) ? undefined : result.at(key))
617
- : result.attributes[key];
715
+ : (cache ?
716
+ (isValuePresent(result.attributes[key]) ? result.attributes[key] : cache[key]) :
717
+ result.attributes[key]
718
+ );
618
719
  }
619
720
  return result;
620
721
  }
@@ -631,7 +732,7 @@
631
732
 
632
733
  if (!path) return path;
633
734
 
634
- //event_type:<path>
735
+ // event_type:<path>
635
736
  var tokens = path.split(":");
636
737
 
637
738
  if (tokens.length > 1) {
@@ -649,7 +750,7 @@
649
750
  var target,
650
751
  scopes = [context];
651
752
 
652
- //Check global scopes after passed-in context
753
+ // Check global scopes after passed-in context
653
754
  scopes.push.apply(scopes, Backbone.Associations.scopes);
654
755
 
655
756
  for (var ctx, i = 0, l = scopes.length; i < l; ++i) {
@@ -664,7 +765,7 @@
664
765
  };
665
766
 
666
767
 
667
- //Infer the relation from the collection's parents and find the appropriate map for the passed in `models`
768
+ // Infer the relation from the collection's parents and find the appropriate map for the passed in `models`
668
769
  var map2models = function (parents, target, models) {
669
770
  var relation, surrogate;
670
771
  //Iterate over collection's parents
@@ -686,6 +787,11 @@
686
787
  return models;
687
788
  };
688
789
 
790
+ // Utility method to check for null or undefined value
791
+ var isValuePresent = function (value) {
792
+ return (!_.isUndefined(value)) && (!_.isNull(value));
793
+ };
794
+
689
795
  var proxies = {};
690
796
  // Proxy Backbone collection methods
691
797
  _.each(['set', 'remove', 'reset'], function (method) {
@@ -1,5 +1,5 @@
1
1
  /*
2
- backbone.paginator 2.0.0
2
+ backbone.paginator 2.0.1
3
3
  http://github.com/backbone-paginator/backbone.paginator
4
4
 
5
5
  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
@@ -470,6 +470,10 @@
470
470
  pageCol.push(nextModel, {onRemove: true});
471
471
  });
472
472
  }
473
+ else if (!pageCol.length && state.totalRecords) {
474
+ pageCol.reset(fullCol.models.slice(pageStart - pageSize, pageEnd - pageSize),
475
+ _extend({}, options, {parse: false}));
476
+ }
473
477
  fullCol.remove(model);
474
478
  }
475
479
  else if (removedIndex >= pageStart && removedIndex < pageEnd) {
@@ -479,6 +483,10 @@
479
483
  });
480
484
  }
481
485
  pageCol.remove(model);
486
+ if (!pageCol.length && state.totalRecords) {
487
+ pageCol.reset(fullCol.models.slice(pageStart - pageSize, pageEnd - pageSize),
488
+ _extend({}, options, {parse: false}));
489
+ }
482
490
  }
483
491
  }
484
492
  else delete options.onAdd;
@@ -1148,7 +1156,10 @@
1148
1156
 
1149
1157
  // fix up sorting parameters
1150
1158
  if (state.sortKey && state.order) {
1151
- data[queryParams.order] = this.queryParams.directions[state.order + ""];
1159
+ var o = _isFunction(queryParams.order) ?
1160
+ queryParams.order.call(thisCopy) :
1161
+ queryParams.order;
1162
+ data[o] = this.queryParams.directions[state.order + ""];
1152
1163
  }
1153
1164
  else if (!state.sortKey) delete data[queryParams.order];
1154
1165
 
@@ -1 +1 @@
1
- //= require js_stack/plugins/backbone/associations/0.6.1
1
+ //= require js_stack/plugins/backbone/associations/0.6.2
@@ -1 +1 @@
1
- //= require js_stack/plugins/backbone/paginator/2.0.0
1
+ //= require js_stack/plugins/backbone/paginator/2.0.1
@@ -1,19 +1,18 @@
1
- // Cocktail.js 0.5.3
1
+ // Cocktail.js 0.5.8
2
2
  // (c) 2012 Onsi Fakhouri
3
3
  // Cocktail.js may be freely distributed under the MIT license.
4
4
  // http://github.com/onsi/cocktail
5
- (function() {
6
- var Cocktail = {};
7
-
8
- if (typeof exports !== 'undefined') {
9
- Cocktail = exports;
5
+ (function(factory) {
6
+ if (typeof require === 'function' && typeof module !== 'undefined' && module.exports) {
7
+ module.exports = factory(require('underscore'));
10
8
  } else if (typeof define === 'function') {
11
- define(function(require) {
12
- return Cocktail;
13
- });
9
+ define(['underscore'], factory);
14
10
  } else {
15
- this.Cocktail = Cocktail;
11
+ this.Cocktail = factory(_);
16
12
  }
13
+ }(function (_) {
14
+
15
+ var Cocktail = {};
17
16
 
18
17
  Cocktail.mixins = {};
19
18
 
@@ -35,7 +34,8 @@
35
34
  if (obj[key] === value) return;
36
35
 
37
36
  if (obj[key]) {
38
- collisions[key] = collisions[key] || [obj[key]];
37
+ // Avoid accessing built-in properties like constructor (#39)
38
+ collisions[key] = collisions.hasOwnProperty(key) ? collisions[key] : [obj[key]];
39
39
  collisions[key].push(value);
40
40
  }
41
41
  obj[key] = value;
@@ -98,4 +98,6 @@
98
98
  klass.extend = originalExtend;
99
99
  });
100
100
  };
101
- })();
101
+
102
+ return Cocktail;
103
+ }));
@@ -1 +1 @@
1
- //= require js_stack/plugins/cocktail/0.5.3
1
+ //= require js_stack/plugins/cocktail/0.5.8
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js_stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Pewiński
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-24 00:00:00.000000000 Z
12
+ date: 2014-07-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: haml_coffee_assets
@@ -128,12 +128,12 @@ files:
128
128
  - vendor/assets/javascripts/js_stack/plugins/backbone.validation.js
129
129
  - vendor/assets/javascripts/js_stack/plugins/backbone.virtualcollection.js
130
130
  - vendor/assets/javascripts/js_stack/plugins/backbone/associations/0.5.5.js
131
- - vendor/assets/javascripts/js_stack/plugins/backbone/associations/0.6.1.js
131
+ - vendor/assets/javascripts/js_stack/plugins/backbone/associations/0.6.2.js
132
132
  - vendor/assets/javascripts/js_stack/plugins/backbone/deepmodel/0.10.4.js
133
133
  - vendor/assets/javascripts/js_stack/plugins/backbone/mutators/0.4.2.js
134
134
  - vendor/assets/javascripts/js_stack/plugins/backbone/pageable/1.3.2.js
135
135
  - vendor/assets/javascripts/js_stack/plugins/backbone/pageable/1.4.8.js
136
- - vendor/assets/javascripts/js_stack/plugins/backbone/paginator/2.0.0.js
136
+ - vendor/assets/javascripts/js_stack/plugins/backbone/paginator/2.0.1.js
137
137
  - vendor/assets/javascripts/js_stack/plugins/backbone/routefilter/0.2.1.js
138
138
  - vendor/assets/javascripts/js_stack/plugins/backbone/stickit/0.6.3.js
139
139
  - vendor/assets/javascripts/js_stack/plugins/backbone/stickit/0.7.0.js
@@ -142,7 +142,7 @@ files:
142
142
  - vendor/assets/javascripts/js_stack/plugins/backbone/validation/0.9.1.js
143
143
  - vendor/assets/javascripts/js_stack/plugins/backbone/virtualcollection/0.4.15.js
144
144
  - vendor/assets/javascripts/js_stack/plugins/cocktail.js
145
- - vendor/assets/javascripts/js_stack/plugins/cocktail/0.5.3.js
145
+ - vendor/assets/javascripts/js_stack/plugins/cocktail/0.5.8.js
146
146
  - vendor/assets/javascripts/js_stack/plugins/moment.js
147
147
  - vendor/assets/javascripts/js_stack/plugins/underscore.inflections.js
148
148
  - vendor/assets/javascripts/js_stack/plugins/underscore.string.js