livelist-rails 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/assets/javascripts/livelist.coffee +57 -52
- data/app/assets/javascripts/livelist.js +61 -61
- data/app/assets/javascripts/livelist.min.js +1 -1
- data/lib/livelist/rails.rb +4 -3
- data/lib/livelist/rails/active_record.rb +12 -144
- data/lib/livelist/rails/filter.rb +109 -0
- data/lib/livelist/rails/filter_collection.rb +34 -0
- data/lib/livelist/rails/filter_criteria.rb +50 -0
- data/lib/livelist/rails/filter_criterion.rb +81 -0
- data/lib/livelist/rails/version.rb +2 -2
- data/livelist-rails.gemspec +3 -5
- data/spec/livelist/rails/active_record_spec.rb +1 -189
- data/spec/livelist/rails/filter_collection_spec.rb +26 -0
- data/spec/livelist/rails/filter_criteria_spec.rb +42 -0
- data/spec/livelist/rails/filter_criterion_spec.rb +34 -0
- data/spec/livelist/rails/filter_spec.rb +54 -0
- metadata +22 -10
| @@ -4,55 +4,45 @@ class window.Utilities | |
| 4 4 |  | 
| 5 5 | 
             
            class window.LiveList extends Utilities
         | 
| 6 6 | 
             
              constructor: (options) ->
         | 
| 7 | 
            -
                @ | 
| 8 | 
            -
                @ | 
| 9 | 
            -
                @ | 
| 10 | 
            -
             | 
| 11 | 
            -
                @ | 
| 12 | 
            -
             | 
| 13 | 
            -
                @ | 
| 14 | 
            -
                @ | 
| 15 | 
            -
                @ | 
| 16 | 
            -
                @list       = new List(@search, @filters, @pagination, @globalOptions, options.list)
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              globalOptions:
         | 
| 19 | 
            -
                data: null
         | 
| 20 | 
            -
                resourceName: 'items'
         | 
| 21 | 
            -
                resourceNameSingular: 'item'
         | 
| 7 | 
            +
                @listSelector         = options.list.renderTo
         | 
| 8 | 
            +
                @resourceName         = options.global.resourceName
         | 
| 9 | 
            +
                @resourceNameSingular = options.global.resourceNameSingular
         | 
| 10 | 
            +
                @eventName            = "livelist:#{@resourceName}"
         | 
| 11 | 
            +
                @urlPrefix            = "/#{@resourceName}"
         | 
| 12 | 
            +
                @search               = new Search(options.search, @)
         | 
| 13 | 
            +
                @filters              = new Filters(options.filters, @)
         | 
| 14 | 
            +
                @pagination           = new Pagination(options.pagination, @)
         | 
| 15 | 
            +
                @list                 = new List(options.list, @)
         | 
| 22 16 |  | 
| 23 17 | 
             
            class window.List extends Utilities
         | 
| 24 | 
            -
              constructor: ( | 
| 25 | 
            -
                @data         = globalOptions.data
         | 
| 18 | 
            +
              constructor: (options, livelist) ->
         | 
| 26 19 | 
             
                @fetchRequest = null
         | 
| 27 | 
            -
                @ | 
| 28 | 
            -
                @filters      = filters
         | 
| 29 | 
            -
                @pagination   = pagination
         | 
| 20 | 
            +
                @livelist     = livelist
         | 
| 30 21 |  | 
| 31 | 
            -
                @ | 
| 32 | 
            -
                @listTemplate            = "{{##{@resourceName}}}{{>#{@resourceNameSingular}}}{{/#{@resourceName}}}"
         | 
| 22 | 
            +
                @listTemplate            = "{{##{@livelist.resourceName}}}{{>#{@livelist.resourceNameSingular}}}{{/#{@livelist.resourceName}}}"
         | 
| 33 23 | 
             
                @listItemTemplate        = '<li>{{id}}</li>'
         | 
| 34 24 | 
             
                @fetchingIndicationClass = 'updating'
         | 
| 35 | 
            -
                @ | 
| 25 | 
            +
                @renderTo                = "ul##{@livelist.resourceName}"
         | 
| 36 26 |  | 
| 37 | 
            -
                 | 
| 27 | 
            +
                @setOptions(options)
         | 
| 38 28 |  | 
| 39 | 
            -
                 | 
| 40 | 
            -
                @fetch(presets:  | 
| 29 | 
            +
                $(@renderTo).bind(@livelist.eventName, (event, params) => @fetch(presets: null, page: params?.page))
         | 
| 30 | 
            +
                @fetch(presets: @livelist.filters.getPresets())
         | 
| 41 31 |  | 
| 42 32 | 
             
              displayFetchingIndication: => $(@renderTo).addClass(@fetchingIndicationClass)
         | 
| 43 33 | 
             
              removeFetchingIndication:  => $(@renderTo).removeClass(@fetchingIndicationClass)
         | 
| 44 34 |  | 
| 45 35 | 
             
              renderIndex: (data, textStatus, jqXHR) =>
         | 
| 46 | 
            -
                @data = data
         | 
| 36 | 
            +
                @livelist.data = data
         | 
| 47 37 | 
             
                @render()
         | 
| 48 | 
            -
                @pagination.render(@data)
         | 
| 49 | 
            -
                @filters.render(@data)
         | 
| 38 | 
            +
                @livelist.pagination.render(@livelist.data)
         | 
| 39 | 
            +
                @livelist.filters.render(@livelist.data)
         | 
| 50 40 |  | 
| 51 41 | 
             
              fetch: (options) ->
         | 
| 52 42 | 
             
                @fetchRequest.abort() if @fetchRequest
         | 
| 53 | 
            -
                searchTerm = @search.searchTerm()
         | 
| 43 | 
            +
                searchTerm = @livelist.search.searchTerm()
         | 
| 54 44 | 
             
                params = {}
         | 
| 55 | 
            -
                params.filters = @filters.setPresets(options.presets)
         | 
| 45 | 
            +
                params.filters = @livelist.filters.setPresets(options.presets)
         | 
| 56 46 |  | 
| 57 47 | 
             
                if searchTerm
         | 
| 58 48 | 
             
                  params.q = searchTerm
         | 
| @@ -60,37 +50,38 @@ class window.List extends Utilities | |
| 60 50 | 
             
                  params.page = options.page
         | 
| 61 51 |  | 
| 62 52 | 
             
                @fetchRequest = $.ajax(
         | 
| 63 | 
            -
                  url         : @urlPrefix
         | 
| 53 | 
            +
                  url         : @livelist.urlPrefix
         | 
| 54 | 
            +
                  type        : @livelist.httpMethod
         | 
| 64 55 | 
             
                  dataType    : 'json'
         | 
| 65 56 | 
             
                  data        : params
         | 
| 66 | 
            -
                  type        : @httpMethod
         | 
| 67 57 | 
             
                  beforeSend  : @displayFetchingIndication
         | 
| 68 58 | 
             
                  success     : @renderIndex
         | 
| 69 59 | 
             
                )
         | 
| 70 60 |  | 
| 71 61 | 
             
              render: ->
         | 
| 72 62 | 
             
                partials = {}
         | 
| 73 | 
            -
                partials[@resourceNameSingular] = @listItemTemplate
         | 
| 74 | 
            -
                listHTML = Mustache.to_html(@listTemplate, @data, partials)
         | 
| 63 | 
            +
                partials[@livelist.resourceNameSingular] = @listItemTemplate
         | 
| 64 | 
            +
                listHTML = Mustache.to_html(@listTemplate, @livelist.data, partials)
         | 
| 75 65 | 
             
                $(@renderTo).html( listHTML )
         | 
| 76 66 | 
             
                @removeFetchingIndication()
         | 
| 77 67 |  | 
| 78 68 | 
             
            window.LiveList.version = '0.0.5'
         | 
| 79 69 |  | 
| 80 70 | 
             
            class window.Filters extends Utilities
         | 
| 81 | 
            -
              constructor: ( | 
| 82 | 
            -
                @ | 
| 71 | 
            +
              constructor: (options, livelist) ->
         | 
| 72 | 
            +
                @livelist = livelist
         | 
| 83 73 | 
             
                @filters = if options.presets then _.keys(options.presets) else []
         | 
| 84 74 | 
             
                @initializeCookies()
         | 
| 85 75 | 
             
                @setOptions(options)
         | 
| 86 | 
            -
             | 
| 76 | 
            +
             | 
| 77 | 
            +
                $('input.filter_option', @renderTo).live( 'change', => $(@livelist.listSelector).trigger(@livelist.eventName) )
         | 
| 87 78 | 
             
                $(@advancedOptionsToggleSelector).click(@handleAdvancedOptionsClick)
         | 
| 88 79 |  | 
| 89 80 | 
             
              initializeCookies: ->
         | 
| 90 81 | 
             
                if jQuery.cookie && @useCookies && @cookieName
         | 
| 91 82 | 
             
                  @cookieName = 'livelist_filter_presets'
         | 
| 92 83 |  | 
| 93 | 
            -
               | 
| 84 | 
            +
              getPresets: ->
         | 
| 94 85 | 
             
                cookie = jQuery.cookie(@cookieName) if jQuery.cookie && @useCookies
         | 
| 95 86 | 
             
                if @useCookies && cookie
         | 
| 96 87 | 
             
                  JSON.parse(cookie)
         | 
| @@ -101,7 +92,7 @@ class window.Filters extends Utilities | |
| 101 92 | 
             
                filters = {}
         | 
| 102 93 | 
             
                if jQuery.isEmptyObject(presets)
         | 
| 103 94 | 
             
                  filters = @selections()
         | 
| 104 | 
            -
                  @setCookie() if jQuery.cookie
         | 
| 95 | 
            +
                  @setCookie(filters) if jQuery.cookie
         | 
| 105 96 | 
             
                else
         | 
| 106 97 | 
             
                  filters = presets
         | 
| 107 98 | 
             
                filters
         | 
| @@ -151,11 +142,25 @@ class window.Filters extends Utilities | |
| 151 142 | 
             
                  )
         | 
| 152 143 | 
             
                )
         | 
| 153 144 |  | 
| 145 | 
            +
              sortOptions: (filters) ->
         | 
| 146 | 
            +
                _.map( filters, (filter) ->
         | 
| 147 | 
            +
                  filter.options = _.sortBy( filter.options, (option) -> option.name)
         | 
| 148 | 
            +
                  filter
         | 
| 149 | 
            +
                )
         | 
| 150 | 
            +
             | 
| 151 | 
            +
              sort: (filters) ->
         | 
| 152 | 
            +
                _.sortBy( filters, (filter) -> filter.name )
         | 
| 153 | 
            +
             | 
| 154 154 | 
             
              render: (data) ->
         | 
| 155 | 
            +
                #What is this for?
         | 
| 155 156 | 
             
                @filters = _.pluck( data.filters, 'filter_slug' )
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                @sort(data.filters)
         | 
| 159 | 
            +
                @sortOptions(data.filters)
         | 
| 160 | 
            +
             | 
| 156 161 | 
             
                filtersHTML = Mustache.to_html(@template, data)
         | 
| 157 162 | 
             
                $(@renderTo).html( filtersHTML )
         | 
| 158 | 
            -
                if @noFiltersSelected(data) && data[@resourceName].length > 0
         | 
| 163 | 
            +
                if @noFiltersSelected(data) && data[@livelist.resourceName].length > 0
         | 
| 159 164 | 
             
                  $('input[type="checkbox"]', @renderTo).attr('checked', 'checked')
         | 
| 160 165 |  | 
| 161 166 |  | 
| @@ -164,12 +169,12 @@ class window.Filters extends Utilities | |
| 164 169 | 
             
                $(@renderTo).slideToggle()
         | 
| 165 170 |  | 
| 166 171 | 
             
            class window.Pagination extends Utilities
         | 
| 167 | 
            -
              constructor: ( | 
| 172 | 
            +
              constructor: (options, livelist) ->
         | 
| 173 | 
            +
                @livelist = livelist
         | 
| 168 174 | 
             
                @pagination = null
         | 
| 169 175 | 
             
                @maxPages   = 30
         | 
| 170 176 |  | 
| 171 | 
            -
                @ | 
| 172 | 
            -
                @emptyListMessage = "<p>No #{@resourceName} matched your filter criteria</p>"
         | 
| 177 | 
            +
                @emptyListMessage = "<p>No #{@livelist.resourceName} matched your filter criteria</p>"
         | 
| 173 178 | 
             
                @setOptions(options)
         | 
| 174 179 |  | 
| 175 180 | 
             
                $("#{@renderTo} a").live( 'click', (event) -> event.preventDefault() )
         | 
| @@ -201,13 +206,13 @@ class window.Pagination extends Utilities | |
| 201 206 | 
             
              '''
         | 
| 202 207 |  | 
| 203 208 | 
             
              pagesJSON: (currentPage, totalPages) ->
         | 
| 204 | 
            -
                groupSize = @maxPages / 2
         | 
| 205 | 
            -
                firstPage = if currentPage  | 
| 209 | 
            +
                groupSize = Math.floor(@maxPages / 2)
         | 
| 210 | 
            +
                firstPage = if currentPage <= groupSize then 1 else currentPage - groupSize
         | 
| 206 211 | 
             
                previousPage = firstPage + groupSize * 2 - 1
         | 
| 207 212 | 
             
                lastPage  = if previousPage >= totalPages then totalPages else previousPage
         | 
| 208 213 | 
             
                _.map([firstPage..lastPage], (page) ->
         | 
| 209 214 | 
             
                  page: page
         | 
| 210 | 
            -
                  currentPage:  | 
| 215 | 
            +
                  currentPage: currentPage is page
         | 
| 211 216 | 
             
                )
         | 
| 212 217 |  | 
| 213 218 | 
             
              paginationJSON: (pagination) ->
         | 
| @@ -217,7 +222,7 @@ class window.Pagination extends Utilities | |
| 217 222 | 
             
                  currentPage      : pagination.current_page
         | 
| 218 223 | 
             
                  nextPage         : pagination.next_page
         | 
| 219 224 | 
             
                  previousPage     : pagination.previous_page
         | 
| 220 | 
            -
                  urlPrefix        : @urlPrefix
         | 
| 225 | 
            +
                  urlPrefix        : @livelist.urlPrefix
         | 
| 221 226 | 
             
                  pages            : @pagesJSON(pagination.current_page, pagination.total_pages)
         | 
| 222 227 | 
             
                }
         | 
| 223 228 |  | 
| @@ -228,11 +233,11 @@ class window.Pagination extends Utilities | |
| 228 233 |  | 
| 229 234 | 
             
              handlePaginationLinkClick: (event) =>
         | 
| 230 235 | 
             
                event.preventDefault()
         | 
| 231 | 
            -
                $(@listSelector).trigger(@eventName, {page: $(event.target).data('page')})
         | 
| 236 | 
            +
                $(@livelist.listSelector).trigger(@livelist.eventName, {page: $(event.target).data('page')})
         | 
| 232 237 |  | 
| 233 238 | 
             
            class window.Search extends Utilities
         | 
| 234 | 
            -
              constructor: ( | 
| 235 | 
            -
                @ | 
| 239 | 
            +
              constructor: (options, livelist) ->
         | 
| 240 | 
            +
                @livelist = livelist
         | 
| 236 241 | 
             
                @setOptions(options)
         | 
| 237 242 | 
             
                $(@formSelector).submit( (event) => @handleSearchFormSubmit(event) )
         | 
| 238 243 |  | 
| @@ -242,4 +247,4 @@ class window.Search extends Utilities | |
| 242 247 |  | 
| 243 248 | 
             
              handleSearchFormSubmit: (event) =>
         | 
| 244 249 | 
             
                event.preventDefault()
         | 
| 245 | 
            -
                $(@listSelector).trigger(@eventName)
         | 
| 250 | 
            +
                $(@livelist.listSelector).trigger(@livelist.eventName)
         | 
| @@ -26,22 +26,17 @@ | |
| 26 26 | 
             
                __extends(LiveList, _super);
         | 
| 27 27 |  | 
| 28 28 | 
             
                function LiveList(options) {
         | 
| 29 | 
            -
                  this. | 
| 30 | 
            -
                  this. | 
| 31 | 
            -
                  this. | 
| 32 | 
            -
                  this. | 
| 33 | 
            -
                  this. | 
| 34 | 
            -
                  this. | 
| 35 | 
            -
                  this. | 
| 36 | 
            -
                  this. | 
| 29 | 
            +
                  this.listSelector = options.list.renderTo;
         | 
| 30 | 
            +
                  this.resourceName = options.global.resourceName;
         | 
| 31 | 
            +
                  this.resourceNameSingular = options.global.resourceNameSingular;
         | 
| 32 | 
            +
                  this.eventName = "livelist:" + this.resourceName;
         | 
| 33 | 
            +
                  this.urlPrefix = "/" + this.resourceName;
         | 
| 34 | 
            +
                  this.search = new Search(options.search, this);
         | 
| 35 | 
            +
                  this.filters = new Filters(options.filters, this);
         | 
| 36 | 
            +
                  this.pagination = new Pagination(options.pagination, this);
         | 
| 37 | 
            +
                  this.list = new List(options.list, this);
         | 
| 37 38 | 
             
                }
         | 
| 38 39 |  | 
| 39 | 
            -
                LiveList.prototype.globalOptions = {
         | 
| 40 | 
            -
                  data: null,
         | 
| 41 | 
            -
                  resourceName: 'items',
         | 
| 42 | 
            -
                  resourceNameSingular: 'item'
         | 
| 43 | 
            -
                };
         | 
| 44 | 
            -
             | 
| 45 40 | 
             
                return LiveList;
         | 
| 46 41 |  | 
| 47 42 | 
             
              })(Utilities);
         | 
| @@ -50,32 +45,26 @@ | |
| 50 45 |  | 
| 51 46 | 
             
                __extends(List, _super);
         | 
| 52 47 |  | 
| 53 | 
            -
                function List( | 
| 54 | 
            -
                  var presets,
         | 
| 55 | 
            -
                    _this = this;
         | 
| 56 | 
            -
                  if (options == null) options = {};
         | 
| 48 | 
            +
                function List(options, livelist) {
         | 
| 57 49 | 
             
                  this.renderIndex = __bind(this.renderIndex, this);
         | 
| 58 50 | 
             
                  this.removeFetchingIndication = __bind(this.removeFetchingIndication, this);
         | 
| 59 51 | 
             
                  this.displayFetchingIndication = __bind(this.displayFetchingIndication, this);
         | 
| 60 | 
            -
                   | 
| 52 | 
            +
                  var _this = this;
         | 
| 61 53 | 
             
                  this.fetchRequest = null;
         | 
| 62 | 
            -
                  this. | 
| 63 | 
            -
                  this. | 
| 64 | 
            -
                  this.pagination = pagination;
         | 
| 65 | 
            -
                  this.setOptions(globalOptions);
         | 
| 66 | 
            -
                  this.listTemplate = "{{#" + this.resourceName + "}}{{>" + this.resourceNameSingular + "}}{{/" + this.resourceName + "}}";
         | 
| 54 | 
            +
                  this.livelist = livelist;
         | 
| 55 | 
            +
                  this.listTemplate = "{{#" + this.livelist.resourceName + "}}{{>" + this.livelist.resourceNameSingular + "}}{{/" + this.livelist.resourceName + "}}";
         | 
| 67 56 | 
             
                  this.listItemTemplate = '<li>{{id}}</li>';
         | 
| 68 57 | 
             
                  this.fetchingIndicationClass = 'updating';
         | 
| 58 | 
            +
                  this.renderTo = "ul#" + this.livelist.resourceName;
         | 
| 69 59 | 
             
                  this.setOptions(options);
         | 
| 70 | 
            -
                  $(this.renderTo).bind(this.eventName, function(event, params) {
         | 
| 60 | 
            +
                  $(this.renderTo).bind(this.livelist.eventName, function(event, params) {
         | 
| 71 61 | 
             
                    return _this.fetch({
         | 
| 72 62 | 
             
                      presets: null,
         | 
| 73 63 | 
             
                      page: params != null ? params.page : void 0
         | 
| 74 64 | 
             
                    });
         | 
| 75 65 | 
             
                  });
         | 
| 76 | 
            -
                  presets = this.filters.presets();
         | 
| 77 66 | 
             
                  this.fetch({
         | 
| 78 | 
            -
                    presets:  | 
| 67 | 
            +
                    presets: this.livelist.filters.getPresets()
         | 
| 79 68 | 
             
                  });
         | 
| 80 69 | 
             
                }
         | 
| 81 70 |  | 
| @@ -88,25 +77,25 @@ | |
| 88 77 | 
             
                };
         | 
| 89 78 |  | 
| 90 79 | 
             
                List.prototype.renderIndex = function(data, textStatus, jqXHR) {
         | 
| 91 | 
            -
                  this.data = data;
         | 
| 80 | 
            +
                  this.livelist.data = data;
         | 
| 92 81 | 
             
                  this.render();
         | 
| 93 | 
            -
                  this.pagination.render(this.data);
         | 
| 94 | 
            -
                  return this.filters.render(this.data);
         | 
| 82 | 
            +
                  this.livelist.pagination.render(this.livelist.data);
         | 
| 83 | 
            +
                  return this.livelist.filters.render(this.livelist.data);
         | 
| 95 84 | 
             
                };
         | 
| 96 85 |  | 
| 97 86 | 
             
                List.prototype.fetch = function(options) {
         | 
| 98 87 | 
             
                  var params, searchTerm;
         | 
| 99 88 | 
             
                  if (this.fetchRequest) this.fetchRequest.abort();
         | 
| 100 | 
            -
                  searchTerm = this.search.searchTerm();
         | 
| 89 | 
            +
                  searchTerm = this.livelist.search.searchTerm();
         | 
| 101 90 | 
             
                  params = {};
         | 
| 102 | 
            -
                  params.filters = this.filters.setPresets(options.presets);
         | 
| 91 | 
            +
                  params.filters = this.livelist.filters.setPresets(options.presets);
         | 
| 103 92 | 
             
                  if (searchTerm) params.q = searchTerm;
         | 
| 104 93 | 
             
                  if (options.page) params.page = options.page;
         | 
| 105 94 | 
             
                  return this.fetchRequest = $.ajax({
         | 
| 106 | 
            -
                    url: this.urlPrefix,
         | 
| 95 | 
            +
                    url: this.livelist.urlPrefix,
         | 
| 96 | 
            +
                    type: this.livelist.httpMethod,
         | 
| 107 97 | 
             
                    dataType: 'json',
         | 
| 108 98 | 
             
                    data: params,
         | 
| 109 | 
            -
                    type: this.httpMethod,
         | 
| 110 99 | 
             
                    beforeSend: this.displayFetchingIndication,
         | 
| 111 100 | 
             
                    success: this.renderIndex
         | 
| 112 101 | 
             
                  });
         | 
| @@ -115,8 +104,8 @@ | |
| 115 104 | 
             
                List.prototype.render = function() {
         | 
| 116 105 | 
             
                  var listHTML, partials;
         | 
| 117 106 | 
             
                  partials = {};
         | 
| 118 | 
            -
                  partials[this.resourceNameSingular] = this.listItemTemplate;
         | 
| 119 | 
            -
                  listHTML = Mustache.to_html(this.listTemplate, this.data, partials);
         | 
| 107 | 
            +
                  partials[this.livelist.resourceNameSingular] = this.listItemTemplate;
         | 
| 108 | 
            +
                  listHTML = Mustache.to_html(this.listTemplate, this.livelist.data, partials);
         | 
| 120 109 | 
             
                  $(this.renderTo).html(listHTML);
         | 
| 121 110 | 
             
                  return this.removeFetchingIndication();
         | 
| 122 111 | 
             
                };
         | 
| @@ -131,16 +120,15 @@ | |
| 131 120 |  | 
| 132 121 | 
             
                __extends(Filters, _super);
         | 
| 133 122 |  | 
| 134 | 
            -
                function Filters( | 
| 135 | 
            -
                  var _this = this;
         | 
| 136 | 
            -
                  if (options == null) options = {};
         | 
| 123 | 
            +
                function Filters(options, livelist) {
         | 
| 137 124 | 
             
                  this.handleAdvancedOptionsClick = __bind(this.handleAdvancedOptionsClick, this);
         | 
| 138 | 
            -
                  this | 
| 125 | 
            +
                  var _this = this;
         | 
| 126 | 
            +
                  this.livelist = livelist;
         | 
| 139 127 | 
             
                  this.filters = options.presets ? _.keys(options.presets) : [];
         | 
| 140 128 | 
             
                  this.initializeCookies();
         | 
| 141 129 | 
             
                  this.setOptions(options);
         | 
| 142 130 | 
             
                  $('input.filter_option', this.renderTo).live('change', function() {
         | 
| 143 | 
            -
                    return $(_this.listSelector).trigger(_this.eventName);
         | 
| 131 | 
            +
                    return $(_this.livelist.listSelector).trigger(_this.livelist.eventName);
         | 
| 144 132 | 
             
                  });
         | 
| 145 133 | 
             
                  $(this.advancedOptionsToggleSelector).click(this.handleAdvancedOptionsClick);
         | 
| 146 134 | 
             
                }
         | 
| @@ -151,7 +139,7 @@ | |
| 151 139 | 
             
                  }
         | 
| 152 140 | 
             
                };
         | 
| 153 141 |  | 
| 154 | 
            -
                Filters.prototype. | 
| 142 | 
            +
                Filters.prototype.getPresets = function() {
         | 
| 155 143 | 
             
                  var cookie;
         | 
| 156 144 | 
             
                  if (jQuery.cookie && this.useCookies) {
         | 
| 157 145 | 
             
                    cookie = jQuery.cookie(this.cookieName);
         | 
| @@ -168,7 +156,7 @@ | |
| 168 156 | 
             
                  filters = {};
         | 
| 169 157 | 
             
                  if (jQuery.isEmptyObject(presets)) {
         | 
| 170 158 | 
             
                    filters = this.selections();
         | 
| 171 | 
            -
                    if (jQuery.cookie) this.setCookie();
         | 
| 159 | 
            +
                    if (jQuery.cookie) this.setCookie(filters);
         | 
| 172 160 | 
             
                  } else {
         | 
| 173 161 | 
             
                    filters = presets;
         | 
| 174 162 | 
             
                  }
         | 
| @@ -201,12 +189,29 @@ | |
| 201 189 | 
             
                  });
         | 
| 202 190 | 
             
                };
         | 
| 203 191 |  | 
| 192 | 
            +
                Filters.prototype.sortOptions = function(filters) {
         | 
| 193 | 
            +
                  return _.map(filters, function(filter) {
         | 
| 194 | 
            +
                    filter.options = _.sortBy(filter.options, function(option) {
         | 
| 195 | 
            +
                      return option.name;
         | 
| 196 | 
            +
                    });
         | 
| 197 | 
            +
                    return filter;
         | 
| 198 | 
            +
                  });
         | 
| 199 | 
            +
                };
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                Filters.prototype.sort = function(filters) {
         | 
| 202 | 
            +
                  return _.sortBy(filters, function(filter) {
         | 
| 203 | 
            +
                    return filter.name;
         | 
| 204 | 
            +
                  });
         | 
| 205 | 
            +
                };
         | 
| 206 | 
            +
             | 
| 204 207 | 
             
                Filters.prototype.render = function(data) {
         | 
| 205 208 | 
             
                  var filtersHTML;
         | 
| 206 209 | 
             
                  this.filters = _.pluck(data.filters, 'filter_slug');
         | 
| 210 | 
            +
                  this.sort(data.filters);
         | 
| 211 | 
            +
                  this.sortOptions(data.filters);
         | 
| 207 212 | 
             
                  filtersHTML = Mustache.to_html(this.template, data);
         | 
| 208 213 | 
             
                  $(this.renderTo).html(filtersHTML);
         | 
| 209 | 
            -
                  if (this.noFiltersSelected(data) && data[this.resourceName].length > 0) {
         | 
| 214 | 
            +
                  if (this.noFiltersSelected(data) && data[this.livelist.resourceName].length > 0) {
         | 
| 210 215 | 
             
                    return $('input[type="checkbox"]', this.renderTo).attr('checked', 'checked');
         | 
| 211 216 | 
             
                  }
         | 
| 212 217 | 
             
                };
         | 
| @@ -224,13 +229,11 @@ | |
| 224 229 |  | 
| 225 230 | 
             
                __extends(Pagination, _super);
         | 
| 226 231 |  | 
| 227 | 
            -
                function Pagination( | 
| 228 | 
            -
                   | 
| 229 | 
            -
                  this.handlePaginationLinkClick = __bind(this.handlePaginationLinkClick, this);
         | 
| 232 | 
            +
                function Pagination(options, livelist) {
         | 
| 233 | 
            +
                  this.handlePaginationLinkClick = __bind(this.handlePaginationLinkClick, this);      this.livelist = livelist;
         | 
| 230 234 | 
             
                  this.pagination = null;
         | 
| 231 235 | 
             
                  this.maxPages = 30;
         | 
| 232 | 
            -
                  this. | 
| 233 | 
            -
                  this.emptyListMessage = "<p>No " + this.resourceName + " matched your filter criteria</p>";
         | 
| 236 | 
            +
                  this.emptyListMessage = "<p>No " + this.livelist.resourceName + " matched your filter criteria</p>";
         | 
| 234 237 | 
             
                  this.setOptions(options);
         | 
| 235 238 | 
             
                  $("" + this.renderTo + " a").live('click', function(event) {
         | 
| 236 239 | 
             
                    return event.preventDefault();
         | 
| @@ -242,8 +245,8 @@ | |
| 242 245 |  | 
| 243 246 | 
             
                Pagination.prototype.pagesJSON = function(currentPage, totalPages) {
         | 
| 244 247 | 
             
                  var firstPage, groupSize, lastPage, previousPage, _i, _results;
         | 
| 245 | 
            -
                  groupSize = this.maxPages / 2;
         | 
| 246 | 
            -
                  firstPage = currentPage  | 
| 248 | 
            +
                  groupSize = Math.floor(this.maxPages / 2);
         | 
| 249 | 
            +
                  firstPage = currentPage <= groupSize ? 1 : currentPage - groupSize;
         | 
| 247 250 | 
             
                  previousPage = firstPage + groupSize * 2 - 1;
         | 
| 248 251 | 
             
                  lastPage = previousPage >= totalPages ? totalPages : previousPage;
         | 
| 249 252 | 
             
                  return _.map((function() {
         | 
| @@ -253,9 +256,7 @@ | |
| 253 256 | 
             
                  }).apply(this), function(page) {
         | 
| 254 257 | 
             
                    return {
         | 
| 255 258 | 
             
                      page: page,
         | 
| 256 | 
            -
                      currentPage:  | 
| 257 | 
            -
                        return currentPage === page;
         | 
| 258 | 
            -
                      }
         | 
| 259 | 
            +
                      currentPage: currentPage === page
         | 
| 259 260 | 
             
                    };
         | 
| 260 261 | 
             
                  });
         | 
| 261 262 | 
             
                };
         | 
| @@ -267,7 +268,7 @@ | |
| 267 268 | 
             
                    currentPage: pagination.current_page,
         | 
| 268 269 | 
             
                    nextPage: pagination.next_page,
         | 
| 269 270 | 
             
                    previousPage: pagination.previous_page,
         | 
| 270 | 
            -
                    urlPrefix: this.urlPrefix,
         | 
| 271 | 
            +
                    urlPrefix: this.livelist.urlPrefix,
         | 
| 271 272 | 
             
                    pages: this.pagesJSON(pagination.current_page, pagination.total_pages)
         | 
| 272 273 | 
             
                  };
         | 
| 273 274 | 
             
                };
         | 
| @@ -281,7 +282,7 @@ | |
| 281 282 |  | 
| 282 283 | 
             
                Pagination.prototype.handlePaginationLinkClick = function(event) {
         | 
| 283 284 | 
             
                  event.preventDefault();
         | 
| 284 | 
            -
                  return $(this.listSelector).trigger(this.eventName, {
         | 
| 285 | 
            +
                  return $(this.livelist.listSelector).trigger(this.livelist.eventName, {
         | 
| 285 286 | 
             
                    page: $(event.target).data('page')
         | 
| 286 287 | 
             
                  });
         | 
| 287 288 | 
             
                };
         | 
| @@ -294,11 +295,10 @@ | |
| 294 295 |  | 
| 295 296 | 
             
                __extends(Search, _super);
         | 
| 296 297 |  | 
| 297 | 
            -
                function Search( | 
| 298 | 
            -
                  var _this = this;
         | 
| 299 | 
            -
                  if (options == null) options = {};
         | 
| 298 | 
            +
                function Search(options, livelist) {
         | 
| 300 299 | 
             
                  this.handleSearchFormSubmit = __bind(this.handleSearchFormSubmit, this);
         | 
| 301 | 
            -
                  this | 
| 300 | 
            +
                  var _this = this;
         | 
| 301 | 
            +
                  this.livelist = livelist;
         | 
| 302 302 | 
             
                  this.setOptions(options);
         | 
| 303 303 | 
             
                  $(this.formSelector).submit(function(event) {
         | 
| 304 304 | 
             
                    return _this.handleSearchFormSubmit(event);
         | 
| @@ -317,7 +317,7 @@ | |
| 317 317 |  | 
| 318 318 | 
             
                Search.prototype.handleSearchFormSubmit = function(event) {
         | 
| 319 319 | 
             
                  event.preventDefault();
         | 
| 320 | 
            -
                  return $(this.listSelector).trigger(this.eventName);
         | 
| 320 | 
            +
                  return $(this.livelist.listSelector).trigger(this.livelist.eventName);
         | 
| 321 321 | 
             
                };
         | 
| 322 322 |  | 
| 323 323 | 
             
                return Search;
         |