livelist-rails 0.0.12 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/livelist.js +352 -305
- data/app/assets/javascripts/livelist.min.js +1 -1
- data/app/assets/javascripts/mustache.min.js +2 -2
- data/app/assets/javascripts/underscore-min.js +5 -31
- data/fletch.yml +14 -0
- data/lib/fletch/asset.rb +43 -0
- data/lib/fletch/version.rb +3 -0
- data/lib/fletch.rb +2 -0
- data/lib/livelist/rails/version.rb +3 -3
- data/lib/tasks/fletch.thor +21 -0
- data/livelist-rails.gemspec +4 -2
- metadata +69 -13
- data/app/assets/javascripts/livelist.coffee +0 -251
@@ -1,328 +1,375 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
1
|
+
// ------ lib/utilities.js -------
|
2
|
+
// Generated by CoffeeScript 1.4.0
|
3
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
5
4
|
|
6
|
-
|
5
|
+
window.Utilities = (function() {
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
}
|
11
|
-
|
12
|
-
Utilities.prototype.setOptions = function(options, context) {
|
13
|
-
var _this = this;
|
14
|
-
if (context == null) context = this;
|
15
|
-
return _.each(options, function(value, option) {
|
16
|
-
return context[option] = value;
|
17
|
-
});
|
18
|
-
};
|
19
|
-
|
20
|
-
return Utilities;
|
21
|
-
|
22
|
-
})();
|
7
|
+
function Utilities() {
|
8
|
+
this.setOptions = __bind(this.setOptions, this);
|
23
9
|
|
24
|
-
|
10
|
+
}
|
25
11
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
this.resourceName = options.global.resourceName;
|
31
|
-
this.resourceNameSingular = options.global.resourceNameSingular;
|
32
|
-
this.urlPrefix = options.global.urlPrefix || ("/" + this.resourceName);
|
33
|
-
this.httpMethod = options.global.httpMethod || 'get';
|
34
|
-
this.eventName = "livelist:" + this.resourceName;
|
35
|
-
this.search = new Search(options.search, this);
|
36
|
-
this.filters = new Filters(options.filters, this);
|
37
|
-
this.pagination = new Pagination(options.pagination, this);
|
38
|
-
this.list = new List(options.list, this);
|
12
|
+
Utilities.prototype.setOptions = function(options, context) {
|
13
|
+
var _this = this;
|
14
|
+
if (context == null) {
|
15
|
+
context = this;
|
39
16
|
}
|
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
|
-
|
17
|
+
return _.each(options, function(value, option) {
|
18
|
+
return context[option] = value;
|
19
|
+
});
|
20
|
+
};
|
21
|
+
|
22
|
+
return Utilities;
|
23
|
+
|
24
|
+
})();
|
25
|
+
|
26
|
+
// ------ lib/livelist.js -------
|
27
|
+
// Generated by CoffeeScript 1.4.0
|
28
|
+
var __hasProp = {}.hasOwnProperty,
|
29
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
30
|
+
|
31
|
+
window.LiveList = (function(_super) {
|
32
|
+
|
33
|
+
__extends(LiveList, _super);
|
34
|
+
|
35
|
+
function LiveList(options) {
|
36
|
+
this.listSelector = options.list.renderTo;
|
37
|
+
this.resourceName = options.global.resourceName;
|
38
|
+
this.resourceNameSingular = options.global.resourceNameSingular;
|
39
|
+
this.urlPrefix = options.global.urlPrefix || ("/" + this.resourceName);
|
40
|
+
this.httpMethod = options.global.httpMethod || 'get';
|
41
|
+
this.eventName = "livelist:" + this.resourceName;
|
42
|
+
this.search = new Search(options.search, this);
|
43
|
+
this.filters = new Filters(options.filters, this);
|
44
|
+
this.pagination = new Pagination(options.pagination, this);
|
45
|
+
this.list = new List(options.list, this);
|
46
|
+
}
|
47
|
+
|
48
|
+
return LiveList;
|
49
|
+
|
50
|
+
})(Utilities);
|
51
|
+
|
52
|
+
// ------ lib/list.js -------
|
53
|
+
// Generated by CoffeeScript 1.4.0
|
54
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
55
|
+
__hasProp = {}.hasOwnProperty,
|
56
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
57
|
+
|
58
|
+
window.List = (function(_super) {
|
59
|
+
|
60
|
+
__extends(List, _super);
|
61
|
+
|
62
|
+
function List(options, livelist) {
|
63
|
+
this.renderIndex = __bind(this.renderIndex, this);
|
64
|
+
|
65
|
+
this.removeFetchingIndication = __bind(this.removeFetchingIndication, this);
|
66
|
+
|
67
|
+
this.displayFetchingIndication = __bind(this.displayFetchingIndication, this);
|
68
|
+
|
69
|
+
var _this = this;
|
70
|
+
this.fetchRequest = null;
|
71
|
+
this.livelist = livelist;
|
72
|
+
this.listTemplate = "{{#" + this.livelist.resourceName + "}}{{>" + this.livelist.resourceNameSingular + "}}{{/" + this.livelist.resourceName + "}}";
|
73
|
+
this.listItemTemplate = '<li>{{id}}</li>';
|
74
|
+
this.fetchingIndicationClass = 'updating';
|
75
|
+
this.renderTo = "ul#" + this.livelist.resourceName;
|
76
|
+
this.setOptions(options);
|
77
|
+
$(this.renderTo).bind(this.livelist.eventName, function(event, params) {
|
78
|
+
return _this.fetch({
|
79
|
+
presets: null,
|
80
|
+
page: params != null ? params.page : void 0
|
69
81
|
});
|
82
|
+
});
|
83
|
+
this.fetch({
|
84
|
+
presets: this.livelist.filters.getPresets()
|
85
|
+
});
|
86
|
+
}
|
87
|
+
|
88
|
+
List.prototype.displayFetchingIndication = function() {
|
89
|
+
return $(this.renderTo).addClass(this.fetchingIndicationClass);
|
90
|
+
};
|
91
|
+
|
92
|
+
List.prototype.removeFetchingIndication = function() {
|
93
|
+
return $(this.renderTo).removeClass(this.fetchingIndicationClass);
|
94
|
+
};
|
95
|
+
|
96
|
+
List.prototype.renderIndex = function(data, textStatus, jqXHR) {
|
97
|
+
this.livelist.data = data;
|
98
|
+
this.render();
|
99
|
+
this.livelist.pagination.render(this.livelist.data);
|
100
|
+
return this.livelist.filters.render(this.livelist.data);
|
101
|
+
};
|
102
|
+
|
103
|
+
List.prototype.fetch = function(options) {
|
104
|
+
var params, searchTerm;
|
105
|
+
if (this.fetchRequest) {
|
106
|
+
this.fetchRequest.abort();
|
70
107
|
}
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
List.prototype.removeFetchingIndication = function() {
|
77
|
-
return $(this.renderTo).removeClass(this.fetchingIndicationClass);
|
78
|
-
};
|
79
|
-
|
80
|
-
List.prototype.renderIndex = function(data, textStatus, jqXHR) {
|
81
|
-
this.livelist.data = data;
|
82
|
-
this.render();
|
83
|
-
this.livelist.pagination.render(this.livelist.data);
|
84
|
-
return this.livelist.filters.render(this.livelist.data);
|
85
|
-
};
|
86
|
-
|
87
|
-
List.prototype.fetch = function(options) {
|
88
|
-
var params, searchTerm;
|
89
|
-
if (this.fetchRequest) this.fetchRequest.abort();
|
90
|
-
searchTerm = this.livelist.search.searchTerm();
|
91
|
-
params = {};
|
92
|
-
params.filters = this.livelist.filters.setPresets(options.presets);
|
93
|
-
if (searchTerm) params.q = searchTerm;
|
94
|
-
if (options.page) params.page = options.page;
|
95
|
-
return this.fetchRequest = $.ajax({
|
96
|
-
url: this.livelist.urlPrefix,
|
97
|
-
type: this.livelist.httpMethod,
|
98
|
-
dataType: 'json',
|
99
|
-
data: params,
|
100
|
-
beforeSend: this.displayFetchingIndication,
|
101
|
-
success: this.renderIndex
|
102
|
-
});
|
103
|
-
};
|
104
|
-
|
105
|
-
List.prototype.render = function() {
|
106
|
-
var listHTML, partials;
|
107
|
-
partials = {};
|
108
|
-
partials[this.livelist.resourceNameSingular] = this.listItemTemplate;
|
109
|
-
listHTML = Mustache.to_html(this.listTemplate, this.livelist.data, partials);
|
110
|
-
$(this.renderTo).html(listHTML);
|
111
|
-
return this.removeFetchingIndication();
|
112
|
-
};
|
113
|
-
|
114
|
-
return List;
|
115
|
-
|
116
|
-
})(Utilities);
|
117
|
-
|
118
|
-
window.LiveList.version = '0.0.7';
|
119
|
-
|
120
|
-
window.Filters = (function(_super) {
|
121
|
-
|
122
|
-
__extends(Filters, _super);
|
123
|
-
|
124
|
-
function Filters(options, livelist) {
|
125
|
-
this.handleAdvancedOptionsClick = __bind(this.handleAdvancedOptionsClick, this);
|
126
|
-
var _this = this;
|
127
|
-
this.livelist = livelist;
|
128
|
-
this.filters = options.presets ? _.keys(options.presets) : [];
|
129
|
-
this.initializeCookies();
|
130
|
-
this.setOptions(options);
|
131
|
-
$('input.filter_option', this.renderTo).live('change', function() {
|
132
|
-
return $(_this.livelist.listSelector).trigger(_this.livelist.eventName);
|
133
|
-
});
|
134
|
-
$(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick);
|
108
|
+
searchTerm = this.livelist.search.searchTerm();
|
109
|
+
params = {};
|
110
|
+
params.filters = this.livelist.filters.setPresets(options.presets);
|
111
|
+
if (searchTerm) {
|
112
|
+
params.q = searchTerm;
|
135
113
|
}
|
114
|
+
if (options.page) {
|
115
|
+
params.page = options.page;
|
116
|
+
}
|
117
|
+
return this.fetchRequest = $.ajax({
|
118
|
+
url: this.livelist.urlPrefix,
|
119
|
+
type: this.livelist.httpMethod,
|
120
|
+
dataType: 'json',
|
121
|
+
data: params,
|
122
|
+
beforeSend: this.displayFetchingIndication,
|
123
|
+
success: this.renderIndex
|
124
|
+
});
|
125
|
+
};
|
126
|
+
|
127
|
+
List.prototype.render = function() {
|
128
|
+
var listHTML, partials;
|
129
|
+
partials = {};
|
130
|
+
partials[this.livelist.resourceNameSingular] = this.listItemTemplate;
|
131
|
+
listHTML = Mustache.to_html(this.listTemplate, this.livelist.data, partials);
|
132
|
+
$(this.renderTo).html(listHTML);
|
133
|
+
return this.removeFetchingIndication();
|
134
|
+
};
|
135
|
+
|
136
|
+
return List;
|
137
|
+
|
138
|
+
})(Utilities);
|
139
|
+
|
140
|
+
// ------ lib/version.js -------
|
141
|
+
// Generated by CoffeeScript 1.4.0
|
142
|
+
|
143
|
+
window.LiveList.version = '0.0.9';
|
144
|
+
|
145
|
+
// ------ lib/filters.js -------
|
146
|
+
// Generated by CoffeeScript 1.4.0
|
147
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
148
|
+
__hasProp = {}.hasOwnProperty,
|
149
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
150
|
+
|
151
|
+
window.Filters = (function(_super) {
|
152
|
+
|
153
|
+
__extends(Filters, _super);
|
154
|
+
|
155
|
+
function Filters(options, livelist) {
|
156
|
+
this.handleAdvancedOptionsClick = __bind(this.handleAdvancedOptionsClick, this);
|
157
|
+
|
158
|
+
var _this = this;
|
159
|
+
this.livelist = livelist;
|
160
|
+
this.filters = options.presets ? _.keys(options.presets) : [];
|
161
|
+
this.initializeCookies();
|
162
|
+
this.setOptions(options);
|
163
|
+
$('input.filter_option', this.renderTo).live('change', function() {
|
164
|
+
return $(_this.livelist.listSelector).trigger(_this.livelist.eventName);
|
165
|
+
});
|
166
|
+
$(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick);
|
167
|
+
}
|
168
|
+
|
169
|
+
Filters.prototype.initializeCookies = function() {
|
170
|
+
if (jQuery.cookie && this.useCookies && this.cookieName) {
|
171
|
+
return this.cookieName = 'livelist_filter_presets';
|
172
|
+
}
|
173
|
+
};
|
136
174
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
}
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
var filters;
|
157
|
-
filters = {};
|
158
|
-
if (jQuery.isEmptyObject(presets)) {
|
159
|
-
filters = this.selections();
|
160
|
-
if (jQuery.cookie) this.setCookie(filters);
|
161
|
-
} else {
|
162
|
-
filters = presets;
|
163
|
-
}
|
164
|
-
return filters;
|
165
|
-
};
|
166
|
-
|
167
|
-
Filters.prototype.setCookie = function(params_filters) {
|
168
|
-
if (!jQuery.isEmptyObject(params_filters)) {
|
169
|
-
return jQuery.cookie(this.cookieName, JSON.stringify(params_filters));
|
175
|
+
Filters.prototype.getPresets = function() {
|
176
|
+
var cookie;
|
177
|
+
if (jQuery.cookie && this.useCookies) {
|
178
|
+
cookie = jQuery.cookie(this.cookieName);
|
179
|
+
}
|
180
|
+
if (this.useCookies && cookie) {
|
181
|
+
return JSON.parse(cookie);
|
182
|
+
} else {
|
183
|
+
return this.presets;
|
184
|
+
}
|
185
|
+
};
|
186
|
+
|
187
|
+
Filters.prototype.setPresets = function(presets) {
|
188
|
+
var filters;
|
189
|
+
filters = {};
|
190
|
+
if (jQuery.isEmptyObject(presets)) {
|
191
|
+
filters = this.selections();
|
192
|
+
if (jQuery.cookie) {
|
193
|
+
this.setCookie(filters);
|
170
194
|
}
|
171
|
-
}
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
var filters,
|
177
|
-
_this = this;
|
178
|
-
filters = {};
|
179
|
-
_.each(this.filters, function(filter) {
|
180
|
-
return filters[filter] = _.pluck($("#" + filter + "_filter_options input.filter_option:checked"), 'value');
|
181
|
-
});
|
182
|
-
return filters;
|
183
|
-
};
|
184
|
-
|
185
|
-
Filters.prototype.noFiltersSelected = function(data) {
|
186
|
-
return _.all(data.filters, function(filter) {
|
187
|
-
return _.all(filter.options, function(option) {
|
188
|
-
return !option.selected;
|
189
|
-
});
|
190
|
-
});
|
191
|
-
};
|
195
|
+
} else {
|
196
|
+
filters = presets;
|
197
|
+
}
|
198
|
+
return filters;
|
199
|
+
};
|
192
200
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
201
|
+
Filters.prototype.setCookie = function(params_filters) {
|
202
|
+
if (!jQuery.isEmptyObject(params_filters)) {
|
203
|
+
return jQuery.cookie(this.cookieName, JSON.stringify(params_filters));
|
204
|
+
}
|
205
|
+
};
|
206
|
+
|
207
|
+
Filters.prototype.template = '{{#filters}}\n<div class=\'filter\'>\n <h3>\n {{name}}\n </h3>\n <ul id=\'{{filter_slug}}_filter_options\'>\n {{#options}}\n <label>\n <li>\n <input {{#selected}}checked=\'checked\'{{/selected}}\n class=\'left filter_option\'\n id=\'filter_{{slug}}\'\n name=\'filters[]\'\n type=\'checkbox\'\n value=\'{{value}}\' />\n <div class=\'left filter_name\'>{{name}}</div>\n <div class=\'right filter_count\'>{{count}}</div>\n <div class=\'clear\'></div>\n </li>\n </label>\n {{/options}}\n </ul>\n</div>\n{{/filters}}';
|
208
|
+
|
209
|
+
Filters.prototype.selections = function() {
|
210
|
+
var filters,
|
211
|
+
_this = this;
|
212
|
+
filters = {};
|
213
|
+
_.each(this.filters, function(filter) {
|
214
|
+
return filters[filter] = _.pluck($("#" + filter + "_filter_options input.filter_option:checked"), 'value');
|
215
|
+
});
|
216
|
+
return filters;
|
217
|
+
};
|
218
|
+
|
219
|
+
Filters.prototype.noFiltersSelected = function(data) {
|
220
|
+
return _.all(data.filters, function(filter) {
|
221
|
+
return _.all(filter.options, function(option) {
|
222
|
+
return !option.selected;
|
199
223
|
});
|
200
|
-
};
|
224
|
+
});
|
225
|
+
};
|
201
226
|
|
202
|
-
|
203
|
-
|
204
|
-
|
227
|
+
Filters.prototype.sortOptions = function(filters) {
|
228
|
+
return _.map(filters, function(filter) {
|
229
|
+
filter.options = _.sortBy(filter.options, function(option) {
|
230
|
+
return option.name;
|
205
231
|
});
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
return Filters;
|
226
|
-
|
227
|
-
})(Utilities);
|
228
|
-
|
229
|
-
window.Pagination = (function(_super) {
|
230
|
-
|
231
|
-
__extends(Pagination, _super);
|
232
|
-
|
233
|
-
function Pagination(options, livelist) {
|
234
|
-
this.handlePaginationLinkClick = __bind(this.handlePaginationLinkClick, this); this.livelist = livelist;
|
235
|
-
this.pagination = null;
|
236
|
-
this.maxPages = 30;
|
237
|
-
this.emptyListMessage = "<p>No " + this.livelist.resourceName + " matched your filter criteria</p>";
|
238
|
-
this.setOptions(options);
|
239
|
-
$("" + this.renderTo + " a").live('click', function(event) {
|
240
|
-
return event.preventDefault();
|
241
|
-
});
|
242
|
-
$("" + this.renderTo + " li:not(.disabled) a").live('click', this.handlePaginationLinkClick);
|
232
|
+
return filter;
|
233
|
+
});
|
234
|
+
};
|
235
|
+
|
236
|
+
Filters.prototype.sort = function(filters) {
|
237
|
+
return _.sortBy(filters, function(filter) {
|
238
|
+
return filter.name;
|
239
|
+
});
|
240
|
+
};
|
241
|
+
|
242
|
+
Filters.prototype.render = function(data) {
|
243
|
+
var filtersHTML;
|
244
|
+
this.filters = _.pluck(data.filters, 'filter_slug');
|
245
|
+
this.sort(data.filters);
|
246
|
+
this.sortOptions(data.filters);
|
247
|
+
filtersHTML = Mustache.to_html(this.template, data);
|
248
|
+
$(this.renderTo).html(filtersHTML);
|
249
|
+
if (this.noFiltersSelected(data) && data[this.livelist.resourceName].length > 0) {
|
250
|
+
return $('input[type="checkbox"]', this.renderTo).attr('checked', 'checked');
|
243
251
|
}
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
252
|
+
};
|
253
|
+
|
254
|
+
Filters.prototype.handleAdvancedOptionsClick = function(event) {
|
255
|
+
event.preventDefault();
|
256
|
+
return $(this.renderTo).slideToggle();
|
257
|
+
};
|
258
|
+
|
259
|
+
return Filters;
|
260
|
+
|
261
|
+
})(Utilities);
|
262
|
+
|
263
|
+
// ------ lib/pagination.js -------
|
264
|
+
// Generated by CoffeeScript 1.4.0
|
265
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
266
|
+
__hasProp = {}.hasOwnProperty,
|
267
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
268
|
+
|
269
|
+
window.Pagination = (function(_super) {
|
270
|
+
|
271
|
+
__extends(Pagination, _super);
|
272
|
+
|
273
|
+
function Pagination(options, livelist) {
|
274
|
+
this.handlePaginationLinkClick = __bind(this.handlePaginationLinkClick, this);
|
275
|
+
this.livelist = livelist;
|
276
|
+
this.pagination = null;
|
277
|
+
this.maxPages = 30;
|
278
|
+
this.emptyListMessage = "<p>No " + this.livelist.resourceName + " matched your filter criteria</p>";
|
279
|
+
this.setOptions(options);
|
280
|
+
$("" + this.renderTo + " a").live('click', function(event) {
|
281
|
+
return event.preventDefault();
|
282
|
+
});
|
283
|
+
$("" + this.renderTo + " li:not(.disabled) a").live('click', this.handlePaginationLinkClick);
|
284
|
+
}
|
285
|
+
|
286
|
+
Pagination.prototype.template = '{{#isEmpty}}\n {{{emptyListMessage}}}\n{{/isEmpty}}\n{{^isEmpty}}\n<div class="pagination">\n <ul>\n <li class="{{^previousPage}}disabled{{/previousPage}}">\n <a href=\'{{urlPrefix}}?page={{previousPage}}\' data-page=\'{{previousPage}}\'>← Previous</a>\n </li>\n\n {{#pages}}\n <li class="{{#currentPage}}active disabled{{/currentPage}}">\n <a href=\'{{urlPrefix}}?page={{page}}\' data-page=\'{{page}}\'>{{page}}</a>\n </li>\n {{/pages}}\n\n <li class="{{^nextPage}}disabled{{/nextPage}}">\n <a href=\'{{urlPrefix}}?page={{nextPage}}\' data-page=\'{{nextPage}}\'>Next →</a>\n </li>\n </ul>\n</div>\n{{/isEmpty}}';
|
287
|
+
|
288
|
+
Pagination.prototype.pagesJSON = function(currentPage, totalPages) {
|
289
|
+
var firstPage, groupSize, lastPage, previousPage, _i, _results;
|
290
|
+
groupSize = Math.floor(this.maxPages / 2);
|
291
|
+
firstPage = currentPage <= groupSize ? 1 : currentPage - groupSize;
|
292
|
+
previousPage = firstPage + groupSize * 2 - 1;
|
293
|
+
lastPage = previousPage >= totalPages ? totalPages : previousPage;
|
294
|
+
return _.map((function() {
|
295
|
+
_results = [];
|
296
|
+
for (var _i = firstPage; firstPage <= lastPage ? _i <= lastPage : _i >= lastPage; firstPage <= lastPage ? _i++ : _i--){ _results.push(_i); }
|
297
|
+
return _results;
|
298
|
+
}).apply(this), function(page) {
|
266
299
|
return {
|
267
|
-
|
268
|
-
|
269
|
-
currentPage: pagination.current_page,
|
270
|
-
nextPage: pagination.next_page,
|
271
|
-
previousPage: pagination.previous_page,
|
272
|
-
urlPrefix: this.livelist.urlPrefix,
|
273
|
-
pages: this.pagesJSON(pagination.current_page, pagination.total_pages)
|
300
|
+
page: page,
|
301
|
+
currentPage: currentPage === page
|
274
302
|
};
|
303
|
+
});
|
304
|
+
};
|
305
|
+
|
306
|
+
Pagination.prototype.paginationJSON = function(pagination) {
|
307
|
+
return {
|
308
|
+
isEmpty: pagination.total_pages === 0,
|
309
|
+
emptyListMessage: this.emptyListMessage,
|
310
|
+
currentPage: pagination.current_page,
|
311
|
+
nextPage: pagination.next_page,
|
312
|
+
previousPage: pagination.previous_page,
|
313
|
+
urlPrefix: this.livelist.urlPrefix,
|
314
|
+
pages: this.pagesJSON(pagination.current_page, pagination.total_pages)
|
275
315
|
};
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
};
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
316
|
+
};
|
317
|
+
|
318
|
+
Pagination.prototype.render = function(data) {
|
319
|
+
var paginationHTML;
|
320
|
+
this.pagination = this.paginationJSON(data.pagination);
|
321
|
+
paginationHTML = Mustache.to_html(this.template, this.pagination);
|
322
|
+
return $(this.renderTo).html(paginationHTML);
|
323
|
+
};
|
324
|
+
|
325
|
+
Pagination.prototype.handlePaginationLinkClick = function(event) {
|
326
|
+
event.preventDefault();
|
327
|
+
return $(this.livelist.listSelector).trigger(this.livelist.eventName, {
|
328
|
+
page: $(event.target).data('page')
|
329
|
+
});
|
330
|
+
};
|
331
|
+
|
332
|
+
return Pagination;
|
333
|
+
|
334
|
+
})(Utilities);
|
335
|
+
|
336
|
+
// ------ lib/search.js -------
|
337
|
+
// Generated by CoffeeScript 1.4.0
|
338
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
339
|
+
__hasProp = {}.hasOwnProperty,
|
340
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
341
|
+
|
342
|
+
window.Search = (function(_super) {
|
343
|
+
|
344
|
+
__extends(Search, _super);
|
345
|
+
|
346
|
+
function Search(options, livelist) {
|
347
|
+
this.handleSearchFormSubmit = __bind(this.handleSearchFormSubmit, this);
|
348
|
+
|
349
|
+
var _this = this;
|
350
|
+
this.livelist = livelist;
|
351
|
+
this.setOptions(options);
|
352
|
+
$(this.formSelector).submit(function(event) {
|
353
|
+
return _this.handleSearchFormSubmit(event);
|
354
|
+
});
|
355
|
+
}
|
356
|
+
|
357
|
+
Search.prototype.searchTerm = function() {
|
358
|
+
var q;
|
359
|
+
q = $(this.searchTextInputSelector).val();
|
360
|
+
if (!q || (q === '')) {
|
361
|
+
return null;
|
362
|
+
} else {
|
363
|
+
return q;
|
307
364
|
}
|
365
|
+
};
|
308
366
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
return null;
|
314
|
-
} else {
|
315
|
-
return q;
|
316
|
-
}
|
317
|
-
};
|
318
|
-
|
319
|
-
Search.prototype.handleSearchFormSubmit = function(event) {
|
320
|
-
event.preventDefault();
|
321
|
-
return $(this.livelist.listSelector).trigger(this.livelist.eventName);
|
322
|
-
};
|
367
|
+
Search.prototype.handleSearchFormSubmit = function(event) {
|
368
|
+
event.preventDefault();
|
369
|
+
return $(this.livelist.listSelector).trigger(this.livelist.eventName);
|
370
|
+
};
|
323
371
|
|
324
|
-
|
372
|
+
return Search;
|
325
373
|
|
326
|
-
|
374
|
+
})(Utilities);
|
327
375
|
|
328
|
-
}).call(this);
|