From 6a23477c4e27d2d5ba6397d5f15d6bd6b2176d7a Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 7 May 2015 17:11:24 +0000 Subject: [PATCH] VRFS-3036 more refactoring --- ruby/lib/jam_ruby.rb | 1 + ruby/lib/jam_ruby/models/band_search.rb | 10 +- .../javascripts/base_search_filter.js.coffee | 3 +- .../musician_search_filter.js.coffee | 230 +++++++++++++++++- 4 files changed, 235 insertions(+), 9 deletions(-) diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index e3af96834..8779d123c 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -221,6 +221,7 @@ require "jam_ruby/models/online_presence" require "jam_ruby/models/json_store" require "jam_ruby/models/base_search" require "jam_ruby/models/musician_search" +require "jam_ruby/models/band_search" include Jampb diff --git a/ruby/lib/jam_ruby/models/band_search.rb b/ruby/lib/jam_ruby/models/band_search.rb index 927049d5b..ced7ea732 100644 --- a/ruby/lib/jam_ruby/models/band_search.rb +++ b/ruby/lib/jam_ruby/models/band_search.rb @@ -1,5 +1,5 @@ module JamRuby - class MusicianSearch < BaseSearch + class BandSearch < BaseSearch attr_accessor :user_counters @@ -16,7 +16,7 @@ module JamRuby SORT_VALS = %W{ distance latency } SORT_ORDERS = { - SORT_VALS[0] => 'Distance to Me' + SORT_VALS[0] => 'Distance to Me', SORT_VALS[1] => 'Latency to Me', } @@ -25,9 +25,9 @@ module JamRuby GenrePlayer::TRADITIONAL_BAND, ] BAND_TYPES = { - INTEREST_VALS[0] => 'Any', - INTEREST_VALS[1] => 'Virtual Band', - INTEREST_VALS[2] => 'Traditional Band', + BAND_TYPE_VALS[0] => 'Any', + BAND_TYPE_VALS[1] => 'Virtual Band', + BAND_TYPE_VALS[2] => 'Traditional Band', } PLAY_COMMIT_VALS = [ANY_VAL_STR, diff --git a/web/app/assets/javascripts/base_search_filter.js.coffee b/web/app/assets/javascripts/base_search_filter.js.coffee index efc876b77..788a61233 100644 --- a/web/app/assets/javascripts/base_search_filter.js.coffee +++ b/web/app/assets/javascripts/base_search_filter.js.coffee @@ -51,10 +51,11 @@ context.JK.BaseSearchFilter = class BaseSearchFilter @resultsListContainer.empty() renderSearchFilter: () => + $.when(@restGet()).done (sFilter) => + this.loadSearchFilter(sFilter) loadSearchFilter: (sFilter) => - _populateSelectWithKeys: (struct, selection, keys, element) => element.children().remove() $.each keys, (idx, value) => diff --git a/web/app/assets/javascripts/musician_search_filter.js.coffee b/web/app/assets/javascripts/musician_search_filter.js.coffee index 3aaa44440..25d08edbc 100644 --- a/web/app/assets/javascripts/musician_search_filter.js.coffee +++ b/web/app/assets/javascripts/musician_search_filter.js.coffee @@ -2,12 +2,237 @@ $ = jQuery context = window context.JK ||= {}; +context.JK.BaseSearchFilter = class BaseSearchFilter + + constructor: () -> + @rest = context.JK.Rest() + @logger = context.JK.logger + @searchFilter = null + @profileUtils = context.JK.ProfileUtils + @helpBubble = context.JK.HelpBubbleHelper + @searchResults = null + @isSearching = false + @pageNumber = 1 + @instrument_logo_map = context.JK.getInstrumentIconMap24() + @searchType = '' + @searchTypeS = '' + @restGet = null + @restPost = null + @searchMeta = null + + init: (app) => + @app = app + @screenBindings = { 'afterShow': this.afterShow, 'afterHide': this.afterHide } + @app.bindScreen(@searchTypeS, @screenBindings) + + @screen = $('#'+@searchTypeS+'-screen') + @resultsListContainer = @screen.find('#'+@searchType+'-search-filter-results-list') + @spinner = @screen.find('.paginate-wait') + + this.registerResultsPagination() + + @screen.find('#btn-'+@searchType+'-search-builder').on 'click', => + this.showBuilder() + + @screen.find('#btn-'+@searchType+'-search-reset').on 'click', => + this.resetFilter() + + afterShow: () => + @screen.find('#'+@searchType+'-search-filter-results').show() + @screen.find('#'+@searchType+'-search-filter-builder').hide() + this.getUserFilterResults() + + showBuilder: () => + @screen.find('#'+@searchType+'-search-filter-results').hide() + @screen.find('#'+@searchType+'-search-filter-builder').show() + @resultsListContainer.empty() + + afterHide: () => + @resultsListContainer.empty() + + renderSearchFilter: () => + $.when(@restGet()).done (sFilter) => + this.loadSearchFilter(sFilter) + + loadSearchFilter: (sFilter) => + + _populateSelectWithKeys: (struct, selection, keys, element) => + element.children().remove() + $.each keys, (idx, value) => + label = struct[value] + blankOption = $ '' + blankOption.text label + blankOption.attr 'value', value + blankOption.attr 'selected', '' if value == selection + element.append(blankOption) + context.JK.dropdown(element) + + _populateSelectIdentifier: (identifier) => + elem = $ '#'+@searchType+'-search-filter-builder select[name='+identifier+']' + struct = @searchMeta[identifier]['map'] + keys = @searchMeta[identifier]['keys'] + this._populateSelectWithKeys(struct, @searchFilter[identifier], keys, elem) + + _populateSelectWithInt: (sourceStruct, selection, element) => + struct = + '-1': 'Any' + $.extend(struct, sourceStruct) + this._populateSelectWithKeys(struct, selection, Object.keys(struct).sort(), element) + + _populateSortOrder: () => + this._populateSelectIdentifier('sort_order') + + _populateGenres: () => + @screen.find('#search-filter-genres').empty() + @rest.getGenres().done (genres) => + genreTemplate = @screen.find('#template-search-filter-setup-genres').html() + selected = '' + $.each genres, (index, genre) => + if 0 < @searchFilter.data_blob.genres.length + genreMatch = $.grep(@searchFilter.data_blob.genres, (n, i) -> + n == genre.id) + else + genreMatch = [] + selected = 'checked' if genreMatch.length > 0 + genreHtml = context.JK.fillTemplate(genreTemplate, + id: genre.id + description: genre.description + checked: selected) + @screen.find('#search-filter-genres').append genreHtml + + _populateInstruments: () => + @screen.find('#search-filter-instruments').empty() + @rest.getInstruments().done (instruments) => + $.each instruments, (index, instrument) => + instrumentTemplate = @screen.find('#template-search-filter-setup-instrument').html() + selected = '' + proficiency = '1' + if 0 < @searchFilter.data_blob.instruments.length + instMatch = $.grep(@searchFilter.data_blob.instruments, (inst, i) -> + yn = inst.instrument_id == instrument.id + proficiency = inst.proficiency_level if yn + yn) + selected = 'checked' if instMatch.length > 0 + instrumentHtml = context.JK.fillTemplate(instrumentTemplate, + id: instrument.id + description: instrument.description + checked: selected) + @screen.find('#search-filter-instruments').append instrumentHtml + profsel = '#search-filter-instruments tr[data-instrument-id="'+instrument.id+'"] select' + jprofsel = @screen.find(profsel) + jprofsel.val(proficiency) + context.JK.dropdown(jprofsel) + return true + + _builderSelectValue: (identifier) => + elem = $ '#'+@searchType+'-search-filter-builder select[name='+identifier+']' + elem.val() + + _builderSelectMultiValue: (identifier) => + vals = [] + elem = $ '#search-filter-'+identifier+' input[type=checkbox]:checked' + if 'instruments' == identifier + elem.each (idx) -> + row = $(this).parent().parent() + instrument = + instrument_id: row.data('instrument-id') + proficiency_level: row.find('select').val() + vals.push instrument + else + elem.each (idx) -> + vals.push $(this).val() + vals + + willSearch: (reload) => + return false if @isSearching + @isSearching = true + if reload + @pageNumber = 1 + @screen.find('#'+@searchType+'-search-filter-spinner').show() + @resultsListContainer.empty() + @screen.find('#'+@searchType+'-search-filter-builder').hide() + @screen.find('#'+@searchType+'-search-filter-results').show() + true + + didSearch: (response) => + this.loadSearchFilter(response.filter_json) + @searchResults = response + @screen.find('#'+@searchType+'-search-filter-spinner').hide() + this.renderResultsPage() + @screen.find('.paginate-wait').hide() + @isSearching = false + + resetFilter: () => + if this.willSearch(true) + @restPost({ filter: 'reset' }).done(this.didSearch) + + cancelFilter: () => + this.resetFilter() + + getUserFilterResults: () => + if this.willSearch(true) + @restGet('results=true').done(this.didSearch) + + performSearch: () => + if this.willSearch(true) + $.each @searchMeta.filter_keys.single, (index, key) => + @searchFilter[key] = this._builderSelectValue(key) + $.each @searchMeta.filter_keys.multi, (index, key) => + @searchFilter[key] = this._builderSelectMultiValue(key) + @restPost({ filter: JSON.stringify(@searchFilter), page: @pageNumber }).done(this.didSearch) + + renderResultsHeader: () => + @screen.find('#'+@searchType+'-search-filter-description').html(@searchResults.description) + if @searchResults.is_blank_filter + @screen.find('#btn-'+@searchType+'-search-reset').hide() + else + @screen.find('#btn-'+@searchType+'-search-reset').show() + + renderResultsPage: () => + + _formatLocation: (band) -> + if band.city and band.state + band.city + ', ' + band.state + else if band.city + band.city + else if band.regionname + band.regionname + else + 'Location Unavailable' + + friendRequestCallback: (user_id)=> + # TODO: + + paginate: () => + if @pageNumber < @searchResults.page_count && this.willSearch(false) + @screen.find('.paginate-wait').show() + @pageNumber += 1 + @restPost({ filter: JSON.stringify(@searchFilter), page: @pageNumber }).done(this.didSearch) + return true + false + + registerResultsPagination: () => + _resultsListContainer = @resultsListContainer + _headerHeight = @screen.find('#'+@searchType+'-search-filter-results-header').height() + _paginator = this.paginate + + @screen.find('.content-body-scroller').scroll -> + if _resultsListContainer.is(':visible') + jthis = $(this) + wintop = jthis.scrollTop() + winheight = jthis.innerHeight() + docheight = jthis[0].scrollHeight - _headerHeight + scrollTrigger = 0.98; + if ((wintop / (docheight - winheight)) >= scrollTrigger) + _paginator() + + context.JK.MusicianSearchFilter = class MusicianSearchFilter extends BaseSearchFilter constructor: () -> super() @searchType = 'musician' - @searchTypeS = @searchTypeS+'s' + @searchTypeS = @searchType+'s' @restGet = @rest.getMusicianSearchFilter @restPost = @rest.postMusicianSearchFilter @searchMeta = gon.musician_search_meta @@ -16,8 +241,7 @@ context.JK.MusicianSearchFilter = class MusicianSearchFilter extends BaseSearchF super(app) renderSearchFilter: () => - $.when(this.rest.getMusicianSearchFilter()).done (sFilter) => - this.loadSearchFilter(sFilter) + super() loadSearchFilter: (sFilter) => super(sFilter)