Skip to content

Commit 8a2a477

Browse files
committed
Use Sammy.js to redesign with a folder structure
Similar to how a file manager works
1 parent d0ec65f commit 8a2a477

File tree

6 files changed

+97
-54
lines changed

6 files changed

+97
-54
lines changed

bower.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"font-awesome": "~4.0.3",
66
"knockoutjs": "~3.2.0",
77
"jquery": "~2.1.3",
8-
"lodash": "~3.0.1"
8+
"lodash": "~3.0.1",
9+
"sammy": "~0.7.6"
910
}
1011
}

lib/thyme/photo.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def self.oldest_first
4242
def as_json(options = {})
4343
super(
4444
options.merge(methods: [:big_thumb_url, :small_thumb_url])
45-
).translate_keys(set_id: :set).camelize_keys
45+
).camelize_keys
4646
end
4747

4848
def big_thumb_url

lib/thyme/server.rb

+13
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,18 @@ class Server < Sinatra::Base
2424
content_type :json
2525
Photo.all(set: { id: params[:set_id].to_i }).oldest_first.to_json
2626
end
27+
28+
get '/photo' do
29+
pass unless request.accept?('application/json')
30+
content_type :json
31+
32+
conditions = { id: params[:photo_id], set: { id: params[:set_id].to_i } }
33+
34+
if photo = Photo.first(conditions)
35+
photo.to_json
36+
else
37+
halt 404, 'Not Found'
38+
end
39+
end
2740
end
2841
end

public/app.js

+43-25
Original file line numberDiff line numberDiff line change
@@ -49,45 +49,63 @@ function SetViewModel(data) {
4949
function ThymeViewModel() {
5050
var self = this;
5151

52-
self.photo = ko.observable();
52+
self.photo = _.tap(ko.observable(), function (observable) {
53+
observable.subscribe(function (photo) {
54+
if (photo) {
55+
location.hash = photo.data.setId + '/' + photo.data.id;
56+
}
57+
});
58+
});
5359

5460
self.photos = ko.observableArray([]);
5561

56-
self.set = ko.observable();
62+
self.set = _.tap(ko.observable(), function (observable) {
63+
observable.subscribe(function (set) {
64+
location.hash = set.data.id;
65+
});
66+
});
5767

5868
self.sets = ko.observableArray([]);
5969

60-
self.loadPhotos = function (set) {
61-
self.photos([]); // clear photos
62-
63-
$.getJSON('/photos', { set_id: set.data.id }, function (photosData) {
64-
_.forEach(photosData, function (photoData, i) {
65-
var photo = new PhotoViewModel(photoData);
66-
self.photos.push(photo);
67-
68-
if (i === 0) {
69-
self.photo(photo); // show photo
70-
}
70+
Sammy(function () {
71+
this.get('#:setId/:photoId', function () {
72+
var data = {
73+
set_id: this.params.setId,
74+
photo_id: this.params.photoId
75+
};
76+
$.getJSON('/photo', data, function (photoData) {
77+
self.photo(new PhotoViewModel(photoData));
7178
});
7279
});
73-
};
7480

75-
self.loadSets = function () {
76-
$.getJSON('/sets', function (setsData) {
77-
_.forEach(setsData, function (setData, i) {
78-
var set = new SetViewModel(setData);
79-
self.sets.push(set);
81+
this.get('#:setId', function () {
82+
self.photo(null);
8083

81-
if (i === 0) {
82-
self.set(set); // load photos
83-
}
84+
if (self.photos().length > 0) { // back pressed
85+
return;
86+
}
87+
88+
$.getJSON('/photos', { set_id: this.params.setId }, function (photosData) {
89+
_.forEach(photosData, function (photoData) {
90+
self.photos.push(new PhotoViewModel(photoData));
91+
});
8492
});
8593
});
86-
};
8794

88-
self.set.subscribe(self.loadPhotos);
95+
this.get('', function () {
96+
self.photos([]);
97+
98+
if (self.sets().length > 0) { // back pressed
99+
return;
100+
}
89101

90-
self.loadSets();
102+
$.getJSON('/sets', function (setsData) {
103+
_.forEach(setsData, function (setData) {
104+
self.sets.push(new SetViewModel(setData));
105+
});
106+
});
107+
});
108+
}).run();
91109
};
92110

93111
// lodash extensions

public/index.html

+19-8
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,26 @@
66
<link rel="stylesheet" href="/thyme.css">
77
</head>
88
<body>
9-
<div id="sets" class="panel">
10-
<ol data-bind="template: { name: 'sets-template', foreach: sets }"></ol>
9+
<div id="pane">
10+
<!-- ko if: photo -->
11+
<div id="photo" data-bind="template: { name: 'photo-template', data: photo }"></div>
12+
<!-- /ko -->
13+
<!-- ko ifnot: photo -->
14+
<ol id="thumbs">
15+
<!-- ko if: photos().length > 0 -->
16+
<!-- ko template: { name: 'photos-template', foreach: photos } -->
17+
<!-- /ko -->
18+
<!-- /ko -->
19+
<!-- ko if: photos().length === 0 -->
20+
<!-- ko template: { name: 'sets-template', foreach: sets } -->
21+
<!-- /ko -->
22+
<!-- /ko -->
23+
</ol>
24+
<!-- /ko -->
1125
</div>
12-
<div id="photos" class="panel">
13-
<ol data-bind="template: { name: 'photos-template', foreach: photos }"></ol>
14-
</div>
15-
<div id="photo" class="panel" data-bind="template: { name: 'photo-template', data: photo, if: photo }"></div>
1626
<script type="text/html" id="sets-template">
1727
<li>
18-
<a href="#" data-bind="attr: { title: data.name }, css: { 'set thumb': true, active: $data == $root.set() }, click: $root.set">
28+
<a href="#" data-bind="attr: { title: data.name }, css: 'set thumb', click: $root.set">
1929
<img data-bind="attr: { src: data.thumbUrl, alt: data.name }">
2030
<h2 data-bind="text: shortName()"></h2>
2131
<p data-bind="attr: { title: photosCountTitle() }">
@@ -27,7 +37,7 @@ <h2 data-bind="text: shortName()"></h2>
2737
</script>
2838
<script type="text/html" id="photos-template">
2939
<li>
30-
<a href="#" data-bind="attr: { title: fileName() }, css: { 'photo thumb': true, active: $data == $root.photo() }, click: $root.photo">
40+
<a href="#" data-bind="attr: { title: fileName() }, css: 'photo thumb', click: $root.photo">
3141
<img data-bind="attr: { src: data.smallThumbUrl, alt: fileName() }">
3242
<h2 data-bind="text: shortName()"></h2>
3343
</a>
@@ -56,6 +66,7 @@ <h2 data-bind="text: shortName()"></h2>
5666
<script src="bower_components/lodash/lodash.js"></script>
5767
<script src="bower_components/moment/moment.js"></script>
5868
<script src="bower_components/knockoutjs/dist/knockout.js"></script>
69+
<script src="bower_components/sammy/lib/sammy.js"></script>
5970
<script src="app.js"></script>
6071
</body>
6172
</html>

public/thyme.css

+19-19
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,37 @@ a {
88
color: #00f;
99
}
1010

11-
.panel {
11+
#pane {
12+
bottom: 0;
13+
left: 0;
1214
position: absolute;
15+
right: 0;
1316
top: 0;
14-
bottom: 0;
15-
overflow-y: auto;
16-
width: 219px;
1717
}
1818

19-
#photos {
20-
left: 219px;
21-
overflow-y: scroll;
19+
#thumbs {
20+
list-style: none;
21+
margin: 0;
22+
overflow: auto;
23+
padding: 10px;
2224
}
2325

24-
#photo {
25-
left: 438px;
26-
right: 0;
27-
width: auto;
26+
#thumbs li {
27+
float: left;
28+
margin: 10px;
2829
}
2930

30-
#sets ol, #photos ol {
31-
list-style: none;
32-
margin: 0;
33-
padding: 0;
31+
#thumbs li img {
32+
border-radius: 5px;
3433
}
3534

36-
#sets a, #photos a {
37-
border: 2px solid #fff;
35+
#thumbs li h2 {
36+
border-bottom-left-radius: 5px;
37+
border-bottom-right-radius: 5px;
3838
}
3939

40-
#sets .active, #photos .active {
41-
border-color: red;
40+
#thumbs li p {
41+
border-top-right-radius: 5px;
4242
}
4343

4444
.thumb {

0 commit comments

Comments
 (0)