-
Notifications
You must be signed in to change notification settings - Fork 0
/
backbone.papertrail.js
71 lines (47 loc) · 1.6 KB
/
backbone.papertrail.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
(function (_, Backbone) {
var PaperTrail = Backbone.PaperTrail = Backbone.Model.extend({
store: function (options) {
options || (options = {});
var attrs = _.clone(this.attributes),
same = _.isEqual(attrs, _.last(this.edits()));
if (!same) this.edits().push(attrs);
return this; // this is
},
restore: function (options) {
options || (options = {});
var index = options._index || 0,
attrs = this.edits()[index];
if (!attrs) return this;
for (var attr in this.attributes) {
if (!attrs[attr]) this.unset(attr);
}
this._edits = this.edits().slice(0, index);
return this.set(attrs);
},
rollback: function (distance) {
distance || (distance = 1);
var index = this.edits()[0] ? (this.edits().length - distance) : 0;
if (index < 0) index = 0;
return this.restore({ _index: index });
},
wasEdited: function () {
return !!this.edits()[0];
},
edits: function () {
return this._edits || (this._edits = []);
},
priorAttributes: function (options) {
options || (options = {});
var distance = options.distance || 1,
index = this.edits()[0] ? (this.edits().length - distance) : 0;
return this.edits()[index];
},
prior: function (attr, options) {
options || (options = {});
var distance = options.distance || 1,
index = this.edits()[0] ? this.edits().length - distance : 0,
result = this.edits()[index];
if (result) return result[attr];
}
});
}).call(this, _, Backbone);