livelist-rails 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ # 0.0.8
2
+ * make counts behave properly, along with some api changes required
3
+ to make counts work properly
4
+
5
+ # 0.0.7
6
+ * changes filters method to filter_for, and filters must be defined
7
+ in separate method calls, i.e.:
8
+
9
+ filter_for :status
10
+ filter_for :state
11
+
12
+ as opposed to:
13
+
14
+ filters :status, :state
15
+
16
+ this is necessary to allow us to pass options on a per filter
17
+ basis
18
+
19
+ * collection option for filter_for method. Passing an option called
20
+ collection to the filter_for method with the value of the option
21
+ being an array of hashes, models, etc., will override the default list
22
+ of filter options if formatted correctly
23
+
1
24
  # 0.0.6
2
25
  * cache counts query per filter, per request
3
26
  * cache option_objects query per filter, per request
@@ -36,11 +36,7 @@ class window.List extends Utilities
36
36
 
37
37
  $(@renderTo).bind(@eventName, (event, params) => @fetch(presets: null, page: params?.page))
38
38
 
39
- cookie = jQuery.cookie(@filters.cookieName) if jQuery.cookie && @filters.useCookies
40
- if @filters.useCookies && cookie
41
- presets = JSON.parse(cookie)
42
- else
43
- presets = @filters.presets
39
+ presets = @filters.presets()
44
40
  @fetch(presets: presets)
45
41
 
46
42
  displayFetchingIndication: => $(@renderTo).addClass(@fetchingIndicationClass)
@@ -50,55 +46,71 @@ class window.List extends Utilities
50
46
  @data = data
51
47
  @render()
52
48
  @pagination.render(@data)
53
- @filters.filters = _.pluck( @data.filters, 'filter_slug' )
54
49
  @filters.render(@data)
55
50
 
56
- selections: ->
57
- filters = {}
58
- _.each( @filters.filters, (filter) => filters[filter] = @filters.filterSelections( filter ) )
59
- filters
60
-
61
51
  fetch: (options) ->
62
52
  @fetchRequest.abort() if @fetchRequest
63
53
  searchTerm = @search.searchTerm()
64
- params = { filters: {} }
54
+ params = {}
55
+ params.filters = @filters.setPresets(options.presets)
65
56
 
66
- if jQuery.isEmptyObject(options.presets)
67
- params.filters = @selections()
68
- if jQuery.cookie && not jQuery.isEmptyObject(params.filters)
69
- jQuery.cookie(@filters.cookieName, JSON.stringify(params.filters))
70
- else
71
- params.filters = options.presets
57
+ if searchTerm
58
+ params.q = searchTerm
59
+ if options.page
60
+ params.page = options.page
72
61
 
73
- if searchTerm then params.q = searchTerm
74
- if options.page then params.page = options.page
75
62
  @fetchRequest = $.ajax(
76
- url: @urlPrefix
77
- dataType: 'json'
78
- data: params
79
- type: @httpMethod
80
- beforeSend: @displayFetchingIndication
81
- success: @renderIndex
63
+ url : @urlPrefix
64
+ dataType : 'json'
65
+ data : params
66
+ type : @httpMethod
67
+ beforeSend : @displayFetchingIndication
68
+ success : @renderIndex
82
69
  )
83
70
 
84
71
  render: ->
85
72
  partials = {}
86
73
  partials[@resourceNameSingular] = @listItemTemplate
87
- $(@renderTo).html( Mustache.to_html(@listTemplate, @data, partials) )
74
+ listHTML = Mustache.to_html(@listTemplate, @data, partials)
75
+ $(@renderTo).html( listHTML )
88
76
  @removeFetchingIndication()
89
77
 
90
- window.LiveList.version = '0.0.3'
78
+ window.LiveList.version = '0.0.4'
91
79
 
92
80
  class window.Filters extends Utilities
93
81
  constructor: (globalOptions, options = {}) ->
94
82
  @setOptions(globalOptions)
95
83
  @filters = if options.presets then _.keys(options.presets) else []
96
- unless @filters.cookieName then @filters.cookieName = 'livelist_filter_presets'
84
+ @initializeCookies()
97
85
  @setOptions(options)
98
86
  $('input.filter_option', @renderTo).live( 'change', => $(@listSelector).trigger(@eventName) )
99
87
  $(@advancedOptionsToggleSelector).click(@handleAdvancedOptionsClick)
100
88
 
101
- filtersTemplate: '''
89
+ initializeCookies: ->
90
+ if jQuery.cookie && @useCookies && @cookieName
91
+ @cookieName = 'livelist_filter_presets'
92
+
93
+ presets: ->
94
+ cookie = jQuery.cookie(@cookieName) if jQuery.cookie && @useCookies
95
+ if @useCookies && cookie
96
+ JSON.parse(cookie)
97
+ else
98
+ @presets
99
+
100
+ setPresets: (presets) ->
101
+ filters = {}
102
+ if jQuery.isEmptyObject(presets)
103
+ filters = @selections()
104
+ @setCookie() if jQuery.cookie
105
+ else
106
+ filters = presets
107
+ filters
108
+
109
+ setCookie: (params_filters) ->
110
+ if not jQuery.isEmptyObject(params_filters)
111
+ jQuery.cookie(@cookieName, JSON.stringify(params_filters))
112
+
113
+ template: '''
102
114
  {{#filters}}
103
115
  <div class='filter'>
104
116
  <h3>
@@ -125,8 +137,12 @@ class window.Filters extends Utilities
125
137
  {{/filters}}
126
138
  '''
127
139
 
128
- filterValues: (filter) -> _.pluck( $(".#{filter}_filter_input"), 'value' )
129
- filterSelections: (filter) -> _.pluck( $("##{filter}_filter_options input.filter_option:checked"), 'value' )
140
+ selections: ->
141
+ filters = {}
142
+ _.each( @filters, (filter) =>
143
+ filters[filter] = _.pluck( $("##{filter}_filter_options input.filter_option:checked"), 'value' )
144
+ )
145
+ filters
130
146
 
131
147
  noFiltersSelected: (data) ->
132
148
  _.all( data.filters, (filter) ->
@@ -136,7 +152,9 @@ class window.Filters extends Utilities
136
152
  )
137
153
 
138
154
  render: (data) ->
139
- $(@renderTo).html( Mustache.to_html(@filtersTemplate, data) )
155
+ @filters = _.pluck( data.filters, 'filter_slug' )
156
+ filtersHTML = Mustache.to_html(@template, data)
157
+ $(@renderTo).html( filtersHTML )
140
158
  if @noFiltersSelected(data) && data[@resourceName].length > 0
141
159
  $('input[type="checkbox"]', @renderTo).attr('checked', 'checked')
142
160
 
@@ -207,7 +225,8 @@ class window.Pagination extends Utilities
207
225
 
208
226
  render: (data) ->
209
227
  @pagination = @paginationJSON(data.pagination)
210
- $(@renderTo).html( Mustache.to_html(@paginationTemplate, @pagination) )
228
+ paginationHTML = Mustache.to_html(@paginationTemplate, @pagination)
229
+ $(@renderTo).html( paginationHTML )
211
230
 
212
231
  handlePaginationLinkClick: (event) =>
213
232
  event.preventDefault()
@@ -51,7 +51,7 @@
51
51
  __extends(List, _super);
52
52
 
53
53
  function List(search, filters, pagination, globalOptions, options) {
54
- var cookie, presets,
54
+ var presets,
55
55
  _this = this;
56
56
  if (options == null) options = {};
57
57
  this.renderIndex = __bind(this.renderIndex, this);
@@ -73,14 +73,7 @@
73
73
  page: params != null ? params.page : void 0
74
74
  });
75
75
  });
76
- if (jQuery.cookie && this.filters.useCookies) {
77
- cookie = jQuery.cookie(this.filters.cookieName);
78
- }
79
- if (this.filters.useCookies && cookie) {
80
- presets = JSON.parse(cookie);
81
- } else {
82
- presets = this.filters.presets;
83
- }
76
+ presets = this.filters.presets();
84
77
  this.fetch({
85
78
  presets: presets
86
79
  });
@@ -98,35 +91,15 @@
98
91
  this.data = data;
99
92
  this.render();
100
93
  this.pagination.render(this.data);
101
- this.filters.filters = _.pluck(this.data.filters, 'filter_slug');
102
94
  return this.filters.render(this.data);
103
95
  };
104
96
 
105
- List.prototype.selections = function() {
106
- var filters,
107
- _this = this;
108
- filters = {};
109
- _.each(this.filters.filters, function(filter) {
110
- return filters[filter] = _this.filters.filterSelections(filter);
111
- });
112
- return filters;
113
- };
114
-
115
97
  List.prototype.fetch = function(options) {
116
98
  var params, searchTerm;
117
99
  if (this.fetchRequest) this.fetchRequest.abort();
118
100
  searchTerm = this.search.searchTerm();
119
- params = {
120
- filters: {}
121
- };
122
- if (jQuery.isEmptyObject(options.presets)) {
123
- params.filters = this.selections();
124
- if (jQuery.cookie && !jQuery.isEmptyObject(params.filters)) {
125
- jQuery.cookie(this.filters.cookieName, JSON.stringify(params.filters));
126
- }
127
- } else {
128
- params.filters = options.presets;
129
- }
101
+ params = {};
102
+ params.filters = this.filters.setPresets(options.presets);
130
103
  if (searchTerm) params.q = searchTerm;
131
104
  if (options.page) params.page = options.page;
132
105
  return this.fetchRequest = $.ajax({
@@ -140,10 +113,11 @@
140
113
  };
141
114
 
142
115
  List.prototype.render = function() {
143
- var partials;
116
+ var listHTML, partials;
144
117
  partials = {};
145
118
  partials[this.resourceNameSingular] = this.listItemTemplate;
146
- $(this.renderTo).html(Mustache.to_html(this.listTemplate, this.data, partials));
119
+ listHTML = Mustache.to_html(this.listTemplate, this.data, partials);
120
+ $(this.renderTo).html(listHTML);
147
121
  return this.removeFetchingIndication();
148
122
  };
149
123
 
@@ -151,7 +125,7 @@
151
125
 
152
126
  })(Utilities);
153
127
 
154
- window.LiveList.version = '0.0.3';
128
+ window.LiveList.version = '0.0.4';
155
129
 
156
130
  window.Filters = (function(_super) {
157
131
 
@@ -163,9 +137,7 @@
163
137
  this.handleAdvancedOptionsClick = __bind(this.handleAdvancedOptionsClick, this);
164
138
  this.setOptions(globalOptions);
165
139
  this.filters = options.presets ? _.keys(options.presets) : [];
166
- if (!this.filters.cookieName) {
167
- this.filters.cookieName = 'livelist_filter_presets';
168
- }
140
+ this.initializeCookies();
169
141
  this.setOptions(options);
170
142
  $('input.filter_option', this.renderTo).live('change', function() {
171
143
  return $(_this.listSelector).trigger(_this.eventName);
@@ -173,14 +145,52 @@
173
145
  $(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick);
174
146
  }
175
147
 
176
- Filters.prototype.filtersTemplate = '{{#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}}';
148
+ Filters.prototype.initializeCookies = function() {
149
+ if (jQuery.cookie && this.useCookies && this.cookieName) {
150
+ return this.cookieName = 'livelist_filter_presets';
151
+ }
152
+ };
153
+
154
+ Filters.prototype.presets = function() {
155
+ var cookie;
156
+ if (jQuery.cookie && this.useCookies) {
157
+ cookie = jQuery.cookie(this.cookieName);
158
+ }
159
+ if (this.useCookies && cookie) {
160
+ return JSON.parse(cookie);
161
+ } else {
162
+ return this.presets;
163
+ }
164
+ };
177
165
 
178
- Filters.prototype.filterValues = function(filter) {
179
- return _.pluck($("." + filter + "_filter_input"), 'value');
166
+ Filters.prototype.setPresets = function(presets) {
167
+ var filters;
168
+ filters = {};
169
+ if (jQuery.isEmptyObject(presets)) {
170
+ filters = this.selections();
171
+ if (jQuery.cookie) this.setCookie();
172
+ } else {
173
+ filters = presets;
174
+ }
175
+ return filters;
180
176
  };
181
177
 
182
- Filters.prototype.filterSelections = function(filter) {
183
- return _.pluck($("#" + filter + "_filter_options input.filter_option:checked"), 'value');
178
+ Filters.prototype.setCookie = function(params_filters) {
179
+ if (!jQuery.isEmptyObject(params_filters)) {
180
+ return jQuery.cookie(this.cookieName, JSON.stringify(params_filters));
181
+ }
182
+ };
183
+
184
+ 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}}';
185
+
186
+ Filters.prototype.selections = function() {
187
+ var filters,
188
+ _this = this;
189
+ filters = {};
190
+ _.each(this.filters, function(filter) {
191
+ return filters[filter] = _.pluck($("#" + filter + "_filter_options input.filter_option:checked"), 'value');
192
+ });
193
+ return filters;
184
194
  };
185
195
 
186
196
  Filters.prototype.noFiltersSelected = function(data) {
@@ -192,7 +202,10 @@
192
202
  };
193
203
 
194
204
  Filters.prototype.render = function(data) {
195
- $(this.renderTo).html(Mustache.to_html(this.filtersTemplate, data));
205
+ var filtersHTML;
206
+ this.filters = _.pluck(data.filters, 'filter_slug');
207
+ filtersHTML = Mustache.to_html(this.template, data);
208
+ $(this.renderTo).html(filtersHTML);
196
209
  if (this.noFiltersSelected(data) && data[this.resourceName].length > 0) {
197
210
  return $('input[type="checkbox"]', this.renderTo).attr('checked', 'checked');
198
211
  }
@@ -257,8 +270,10 @@
257
270
  };
258
271
 
259
272
  Pagination.prototype.render = function(data) {
273
+ var paginationHTML;
260
274
  this.pagination = this.paginationJSON(data.pagination);
261
- return $(this.renderTo).html(Mustache.to_html(this.paginationTemplate, this.pagination));
275
+ paginationHTML = Mustache.to_html(this.paginationTemplate, this.pagination);
276
+ return $(this.renderTo).html(paginationHTML);
262
277
  };
263
278
 
264
279
  Pagination.prototype.handlePaginationLinkClick = function(event) {
@@ -1 +1 @@
1
- ((function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},b=Object.prototype.hasOwnProperty,c=function(a,c){function e(){this.constructor=a}for(var d in c)b.call(c,d)&&(a[d]=c[d]);return e.prototype=c.prototype,a.prototype=new e,a.__super__=c.prototype,a};window.Utilities=function(){function b(){this.setOptions=a(this.setOptions,this)}return b.prototype.setOptions=function(a,b){var c=this;return b==null&&(b=this),_.each(a,function(a,c){return b[c]=a})},b}(),window.LiveList=function(a){function b(a){this.globalOptions.listSelector=a.list.renderTo,this.globalOptions.eventName="livelist:"+a.global.resourceName,this.globalOptions.urlPrefix="/"+a.global.resourceName,this.setOptions(a.global,this.globalOptions),this.search=new Search(this.globalOptions,a.search),this.filters=new Filters(this.globalOptions,a.filters),this.pagination=new Pagination(this.globalOptions,a.pagination),this.list=new List(this.search,this.filters,this.pagination,this.globalOptions,a.list)}return c(b,a),b.prototype.globalOptions={data:null,resourceName:"items",resourceNameSingular:"item"},b}(Utilities),window.List=function(b){function d(b,c,d,e,f){var g,h,i=this;f==null&&(f={}),this.renderIndex=a(this.renderIndex,this),this.removeFetchingIndication=a(this.removeFetchingIndication,this),this.displayFetchingIndication=a(this.displayFetchingIndication,this),this.data=e.data,this.fetchRequest=null,this.search=b,this.filters=c,this.pagination=d,this.setOptions(e),this.listTemplate="{{#"+this.resourceName+"}}{{>"+this.resourceNameSingular+"}}{{/"+this.resourceName+"}}",this.listItemTemplate="<li>{{id}}</li>",this.fetchingIndicationClass="updating",this.setOptions(f),$(this.renderTo).bind(this.eventName,function(a,b){return i.fetch({presets:null,page:b!=null?b.page:void 0})}),jQuery.cookie&&this.filters.useCookies&&(g=jQuery.cookie(this.filters.cookieName)),this.filters.useCookies&&g?h=JSON.parse(g):h=this.filters.presets,this.fetch({presets:h})}return c(d,b),d.prototype.displayFetchingIndication=function(){return $(this.renderTo).addClass(this.fetchingIndicationClass)},d.prototype.removeFetchingIndication=function(){return $(this.renderTo).removeClass(this.fetchingIndicationClass)},d.prototype.renderIndex=function(a,b,c){return this.data=a,this.render(),this.pagination.render(this.data),this.filters.filters=_.pluck(this.data.filters,"filter_slug"),this.filters.render(this.data)},d.prototype.selections=function(){var a,b=this;return a={},_.each(this.filters.filters,function(c){return a[c]=b.filters.filterSelections(c)}),a},d.prototype.fetch=function(a){var b,c;return this.fetchRequest&&this.fetchRequest.abort(),c=this.search.searchTerm(),b={filters:{}},jQuery.isEmptyObject(a.presets)?(b.filters=this.selections(),jQuery.cookie&&!jQuery.isEmptyObject(b.filters)&&jQuery.cookie(this.filters.cookieName,JSON.stringify(b.filters))):b.filters=a.presets,c&&(b.q=c),a.page&&(b.page=a.page),this.fetchRequest=$.ajax({url:this.urlPrefix,dataType:"json",data:b,type:this.httpMethod,beforeSend:this.displayFetchingIndication,success:this.renderIndex})},d.prototype.render=function(){var a;return a={},a[this.resourceNameSingular]=this.listItemTemplate,$(this.renderTo).html(Mustache.to_html(this.listTemplate,this.data,a)),this.removeFetchingIndication()},d}(Utilities),window.LiveList.version="0.0.3",window.Filters=function(b){function d(b,c){var d=this;c==null&&(c={}),this.handleAdvancedOptionsClick=a(this.handleAdvancedOptionsClick,this),this.setOptions(b),this.filters=c.presets?_.keys(c.presets):[],this.filters.cookieName||(this.filters.cookieName="livelist_filter_presets"),this.setOptions(c),$("input.filter_option",this.renderTo).live("change",function(){return $(d.listSelector).trigger(d.eventName)}),$(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick)}return c(d,b),d.prototype.filtersTemplate="{{#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}}",d.prototype.filterValues=function(a){return _.pluck($("."+a+"_filter_input"),"value")},d.prototype.filterSelections=function(a){return _.pluck($("#"+a+"_filter_options input.filter_option:checked"),"value")},d.prototype.noFiltersSelected=function(a){return _.all(a.filters,function(a){return _.all(a.options,function(a){return!a.selected})})},d.prototype.render=function(a){$(this.renderTo).html(Mustache.to_html(this.filtersTemplate,a));if(this.noFiltersSelected(a)&&a[this.resourceName].length>0)return $('input[type="checkbox"]',this.renderTo).attr("checked","checked")},d.prototype.handleAdvancedOptionsClick=function(a){return a.preventDefault(),$(this.renderTo).slideToggle()},d}(Utilities),window.Pagination=function(b){function d(b,c){c==null&&(c={}),this.handlePaginationLinkClick=a(this.handlePaginationLinkClick,this),this.pagination=null,this.maxPages=30,this.setOptions(b),this.emptyListMessage="<p>No "+this.resourceName+" matched your filter criteria</p>",this.setOptions(c),$(""+this.renderTo+" a").live("click",this.handlePaginationLinkClick)}return c(d,b),d.prototype.paginationTemplate="{{#isEmpty}}\n {{{emptyListMessage}}}\n{{/isEmpty}}\n{{^isEmpty}}\n{{#previousPage}}\n <a href='{{urlPrefix}}?page={{previousPage}}' data-page='{{previousPage}}'>← Previous</a>\n{{/previousPage}}\n{{^previousPage}}\n <span>← Previous</span>\n{{/previousPage}}\n{{#pages}}\n {{#currentPage}}\n <span>{{page}}</span>\n {{/currentPage}}\n {{^currentPage}}\n <a href='{{urlPrefix}}?page={{page}}' data-page='{{page}}'>{{page}}</a>\n {{/currentPage}}\n{{/pages}}\n{{#nextPage}}\n <a href='{{urlPrefix}}?page={{nextPage}}' data-page='{{nextPage}}'>Next →</a>\n{{/nextPage}}\n{{^nextPage}}\n <span>Next →</span>\n{{/nextPage}}\n{{/isEmpty}}",d.prototype.pagesJSON=function(a,b){var c,d,e,f,g,h;return d=this.maxPages/2,c=a<d?1:a-d,f=c+d*2-1,e=f>=b?b:f,_.map(function(){h=[];for(var a=c;c<=e?a<=e:a>=e;c<=e?a++:a--)h.push(a);return h}.apply(this),function(b){return{page:b,currentPage:function(){return a===b}}})},d.prototype.paginationJSON=function(a){return{isEmpty:a.total_pages===0,emptyListMessage:this.emptyListMessage,currentPage:a.current_page,nextPage:a.next_page,previousPage:a.previous_page,urlPrefix:this.urlPrefix,pages:this.pagesJSON(a.current_page,a.total_pages)}},d.prototype.render=function(a){return this.pagination=this.paginationJSON(a.pagination),$(this.renderTo).html(Mustache.to_html(this.paginationTemplate,this.pagination))},d.prototype.handlePaginationLinkClick=function(a){return a.preventDefault(),$(this.listSelector).trigger(this.eventName,{page:$(a.target).data("page")})},d}(Utilities),window.Search=function(b){function d(b,c){var d=this;c==null&&(c={}),this.handleSearchFormSubmit=a(this.handleSearchFormSubmit,this),this.setOptions(b),this.setOptions(c),$(this.formSelector).submit(function(a){return d.handleSearchFormSubmit(a)})}return c(d,b),d.prototype.searchTerm=function(){var a;return a=$(this.searchTextInputSelector).val(),!a||a===""?null:a},d.prototype.handleSearchFormSubmit=function(a){return a.preventDefault(),$(this.listSelector).trigger(this.eventName)},d}(Utilities)})).call(this);
1
+ ((function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},b=Object.prototype.hasOwnProperty,c=function(a,c){function e(){this.constructor=a}for(var d in c)b.call(c,d)&&(a[d]=c[d]);return e.prototype=c.prototype,a.prototype=new e,a.__super__=c.prototype,a};window.Utilities=function(){function b(){this.setOptions=a(this.setOptions,this)}return b.prototype.setOptions=function(a,b){var c=this;return b==null&&(b=this),_.each(a,function(a,c){return b[c]=a})},b}(),window.LiveList=function(a){function b(a){this.globalOptions.listSelector=a.list.renderTo,this.globalOptions.eventName="livelist:"+a.global.resourceName,this.globalOptions.urlPrefix="/"+a.global.resourceName,this.setOptions(a.global,this.globalOptions),this.search=new Search(this.globalOptions,a.search),this.filters=new Filters(this.globalOptions,a.filters),this.pagination=new Pagination(this.globalOptions,a.pagination),this.list=new List(this.search,this.filters,this.pagination,this.globalOptions,a.list)}return c(b,a),b.prototype.globalOptions={data:null,resourceName:"items",resourceNameSingular:"item"},b}(Utilities),window.List=function(b){function d(b,c,d,e,f){var g,h=this;f==null&&(f={}),this.renderIndex=a(this.renderIndex,this),this.removeFetchingIndication=a(this.removeFetchingIndication,this),this.displayFetchingIndication=a(this.displayFetchingIndication,this),this.data=e.data,this.fetchRequest=null,this.search=b,this.filters=c,this.pagination=d,this.setOptions(e),this.listTemplate="{{#"+this.resourceName+"}}{{>"+this.resourceNameSingular+"}}{{/"+this.resourceName+"}}",this.listItemTemplate="<li>{{id}}</li>",this.fetchingIndicationClass="updating",this.setOptions(f),$(this.renderTo).bind(this.eventName,function(a,b){return h.fetch({presets:null,page:b!=null?b.page:void 0})}),g=this.filters.presets(),this.fetch({presets:g})}return c(d,b),d.prototype.displayFetchingIndication=function(){return $(this.renderTo).addClass(this.fetchingIndicationClass)},d.prototype.removeFetchingIndication=function(){return $(this.renderTo).removeClass(this.fetchingIndicationClass)},d.prototype.renderIndex=function(a,b,c){return this.data=a,this.render(),this.pagination.render(this.data),this.filters.render(this.data)},d.prototype.fetch=function(a){var b,c;return this.fetchRequest&&this.fetchRequest.abort(),c=this.search.searchTerm(),b={},b.filters=this.filters.setPresets(a.presets),c&&(b.q=c),a.page&&(b.page=a.page),this.fetchRequest=$.ajax({url:this.urlPrefix,dataType:"json",data:b,type:this.httpMethod,beforeSend:this.displayFetchingIndication,success:this.renderIndex})},d.prototype.render=function(){var a,b;return b={},b[this.resourceNameSingular]=this.listItemTemplate,a=Mustache.to_html(this.listTemplate,this.data,b),$(this.renderTo).html(a),this.removeFetchingIndication()},d}(Utilities),window.LiveList.version="0.0.4",window.Filters=function(b){function d(b,c){var d=this;c==null&&(c={}),this.handleAdvancedOptionsClick=a(this.handleAdvancedOptionsClick,this),this.setOptions(b),this.filters=c.presets?_.keys(c.presets):[],this.initializeCookies(),this.setOptions(c),$("input.filter_option",this.renderTo).live("change",function(){return $(d.listSelector).trigger(d.eventName)}),$(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick)}return c(d,b),d.prototype.initializeCookies=function(){if(jQuery.cookie&&this.useCookies&&this.cookieName)return this.cookieName="livelist_filter_presets"},d.prototype.presets=function(){var a;return jQuery.cookie&&this.useCookies&&(a=jQuery.cookie(this.cookieName)),this.useCookies&&a?JSON.parse(a):this.presets},d.prototype.setPresets=function(a){var b;return b={},jQuery.isEmptyObject(a)?(b=this.selections(),jQuery.cookie&&this.setCookie()):b=a,b},d.prototype.setCookie=function(a){if(!jQuery.isEmptyObject(a))return jQuery.cookie(this.cookieName,JSON.stringify(a))},d.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}}",d.prototype.selections=function(){var a,b=this;return a={},_.each(this.filters,function(b){return a[b]=_.pluck($("#"+b+"_filter_options input.filter_option:checked"),"value")}),a},d.prototype.noFiltersSelected=function(a){return _.all(a.filters,function(a){return _.all(a.options,function(a){return!a.selected})})},d.prototype.render=function(a){var b;this.filters=_.pluck(a.filters,"filter_slug"),b=Mustache.to_html(this.template,a),$(this.renderTo).html(b);if(this.noFiltersSelected(a)&&a[this.resourceName].length>0)return $('input[type="checkbox"]',this.renderTo).attr("checked","checked")},d.prototype.handleAdvancedOptionsClick=function(a){return a.preventDefault(),$(this.renderTo).slideToggle()},d}(Utilities),window.Pagination=function(b){function d(b,c){c==null&&(c={}),this.handlePaginationLinkClick=a(this.handlePaginationLinkClick,this),this.pagination=null,this.maxPages=30,this.setOptions(b),this.emptyListMessage="<p>No "+this.resourceName+" matched your filter criteria</p>",this.setOptions(c),$(""+this.renderTo+" a").live("click",this.handlePaginationLinkClick)}return c(d,b),d.prototype.paginationTemplate="{{#isEmpty}}\n {{{emptyListMessage}}}\n{{/isEmpty}}\n{{^isEmpty}}\n{{#previousPage}}\n <a href='{{urlPrefix}}?page={{previousPage}}' data-page='{{previousPage}}'>← Previous</a>\n{{/previousPage}}\n{{^previousPage}}\n <span>← Previous</span>\n{{/previousPage}}\n{{#pages}}\n {{#currentPage}}\n <span>{{page}}</span>\n {{/currentPage}}\n {{^currentPage}}\n <a href='{{urlPrefix}}?page={{page}}' data-page='{{page}}'>{{page}}</a>\n {{/currentPage}}\n{{/pages}}\n{{#nextPage}}\n <a href='{{urlPrefix}}?page={{nextPage}}' data-page='{{nextPage}}'>Next →</a>\n{{/nextPage}}\n{{^nextPage}}\n <span>Next →</span>\n{{/nextPage}}\n{{/isEmpty}}",d.prototype.pagesJSON=function(a,b){var c,d,e,f,g,h;return d=this.maxPages/2,c=a<d?1:a-d,f=c+d*2-1,e=f>=b?b:f,_.map(function(){h=[];for(var a=c;c<=e?a<=e:a>=e;c<=e?a++:a--)h.push(a);return h}.apply(this),function(b){return{page:b,currentPage:function(){return a===b}}})},d.prototype.paginationJSON=function(a){return{isEmpty:a.total_pages===0,emptyListMessage:this.emptyListMessage,currentPage:a.current_page,nextPage:a.next_page,previousPage:a.previous_page,urlPrefix:this.urlPrefix,pages:this.pagesJSON(a.current_page,a.total_pages)}},d.prototype.render=function(a){var b;return this.pagination=this.paginationJSON(a.pagination),b=Mustache.to_html(this.paginationTemplate,this.pagination),$(this.renderTo).html(b)},d.prototype.handlePaginationLinkClick=function(a){return a.preventDefault(),$(this.listSelector).trigger(this.eventName,{page:$(a.target).data("page")})},d}(Utilities),window.Search=function(b){function d(b,c){var d=this;c==null&&(c={}),this.handleSearchFormSubmit=a(this.handleSearchFormSubmit,this),this.setOptions(b),this.setOptions(c),$(this.formSelector).submit(function(a){return d.handleSearchFormSubmit(a)})}return c(d,b),d.prototype.searchTerm=function(){var a;return a=$(this.searchTextInputSelector).val(),!a||a===""?null:a},d.prototype.handleSearchFormSubmit=function(a){return a.preventDefault(),$(this.listSelector).trigger(this.eventName)},d}(Utilities)})).call(this);
@@ -24,8 +24,9 @@ module Livelist
24
24
 
25
25
  def filter_relation(filter_params)
26
26
  relation = scoped
27
- filter_params.each do |filter, values|
28
- relation = relation.send("#{filter}_relation", values)
27
+ @@filter_slugs.each do |filter_slug|
28
+ values = filter_params[filter_slug.to_s]
29
+ relation = relation.send("#{filter_slug}_relation", values) unless filter_params.empty?
29
30
  end
30
31
  relation
31
32
  end
@@ -92,7 +93,7 @@ module Livelist
92
93
  query = scoped.except(:order)
93
94
  @@filter_slugs.each do |slug|
94
95
  query = query.send("#{slug}_join")
95
- query = query.send("#{slug}_where", @@filter_params[slug]) unless slug.to_s == filter_slug
96
+ query = query.send("#{slug}_where", @@filter_params[slug]) unless @@filter_params[filter_slug].nil? || (slug.to_s == filter_slug)
96
97
  end
97
98
  group_by = send("#{filter_slug}_counts_group_by")
98
99
  query.group(group_by).count
@@ -1,7 +1,7 @@
1
1
  module Livelist
2
2
  module Rails
3
- VERSION = '0.0.8'
4
- LIVELIST_VERSION = '0.0.3'
3
+ VERSION = '0.0.9'
4
+ LIVELIST_VERSION = '0.0.4'
5
5
  MUSTACHE_VERSION = 'db5f5ece0b6c87bbb2d0584010b97f8723dde69d'
6
6
  UNDERSCORE_VERSION = '1.2.3'
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: livelist-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-27 00:00:00.000000000Z
12
+ date: 2012-02-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &17388780 !ruby/object:Gem::Requirement
16
+ requirement: &16423600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *17388780
24
+ version_requirements: *16423600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &17388360 !ruby/object:Gem::Requirement
27
+ requirement: &16423180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *17388360
35
+ version_requirements: *16423180
36
36
  description: ! 'livelist-rails is a Rails 3.1 Engine/Extensiont incorporating the
37
37
  following javascript libraries: Mustache.js, underscore.js, jQuery and livelist.js,
38
38
  and providing ActiveRecord filtering extenstions.'
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: '0'
85
85
  requirements: []
86
86
  rubyforge_project: livelist-rails
87
- rubygems_version: 1.8.10
87
+ rubygems_version: 1.8.15
88
88
  signing_key:
89
89
  specification_version: 3
90
90
  summary: A Rails Engine/Extension Incorporating Livelist.js