forked from agorf/thyme
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
122 lines (96 loc) · 2.74 KB
/
app.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
function PhotoViewModel(data) {
var self = this;
self.data = data;
self.aspectRatio = function () {
var width = self.data.width;
var height = self.data.height;
var gcd = _.gcd(width, height);
return (width / gcd) + ':' + (height / gcd);
};
self.fileName = function () {
return self.data.path.split('/').reverse()[0];
};
self.shortName = function () {
return _.trunc(self.fileName(), 20);
};
self.formattedSize = function () {
return (Math.round((self.data.size / (1024 * 1024)) * 100) / 100) + ' MB';
};
self.formattedTakenAt = function () {
return moment(self.data.takenAt).format('ddd, D MMM YYYY HH:mm:ss z');
};
self.relativeTakenAt = function () {
return moment(self.data.takenAt).fromNow();
};
}
function SetViewModel(data) {
var self = this;
self.data = data;
self.photosCountTitle = function () {
return _.pluralize(self.data.photosCount, 'photo');
};
self.shortName = function () {
return _.trunc(self.data.name, 20);
};
}
function ThymeViewModel() {
var self = this;
self.photo = _.tap(ko.observable(), function (observable) {
observable.subscribe(function (photo) {
if (photo) {
location.hash = photo.data.setId + '/' + photo.data.id;
}
});
});
self.photos = ko.observableArray([]);
self.set = _.tap(ko.observable(), function (observable) {
observable.subscribe(function (set) {
location.hash = set.data.id;
});
});
self.sets = ko.observableArray([]);
Sammy(function () {
this.get('#:setId/:photoId', function () {
var data = {
set_id: this.params.setId,
photo_id: this.params.photoId
};
$.getJSON('/photo', data, function (photoData) {
self.photo(new PhotoViewModel(photoData));
});
});
this.get('#:setId', function () {
self.photo(null);
if (self.photos().length > 0) { // back pressed
return;
}
$.getJSON('/photos', { set_id: this.params.setId }, function (photosData) {
_.forEach(photosData, function (photoData) {
self.photos.push(new PhotoViewModel(photoData));
});
});
});
this.get('', function () {
self.photos([]);
if (self.sets().length > 0) { // back pressed
return;
}
$.getJSON('/sets', function (setsData) {
_.forEach(setsData, function (setData) {
self.sets.push(new SetViewModel(setData));
});
});
});
}).run();
};
// lodash extensions
_.mixin({
gcd: function (a, b) {
return b ? _.gcd(b, a % b) : Math.abs(a);
},
pluralize: function (n, singular, plural) {
plural = plural || singular + 's';
return n + ' ' + (n === 1 ? singular : plural);
}
});
ko.applyBindings(new ThymeViewModel());