From 0e9f78ccdd414b0b3bacbdea85d2bc5a2335940b Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 2 Mar 2015 09:41:53 +0000 Subject: [PATCH] VRFS-2795 search filter front end start --- ruby/lib/jam_ruby/models/musician_search.rb | 14 ++++- web/app/assets/javascripts/jam_rest.js | 13 ++++ .../musician_search_filter.js.coffee | 61 +++++++++++++++++++ web/app/controllers/api_search_controller.rb | 11 ++++ web/app/controllers/spikes_controller.rb | 5 ++ .../clients/_musician_search_filter.html.slim | 51 ++++++++++++++++ .../spikes/musician_search_filter.html.slim | 14 +++++ web/config/routes.rb | 2 + 8 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 web/app/assets/javascripts/musician_search_filter.js.coffee create mode 100644 web/app/views/clients/_musician_search_filter.html.slim create mode 100644 web/app/views/spikes/musician_search_filter.html.slim diff --git a/ruby/lib/jam_ruby/models/musician_search.rb b/ruby/lib/jam_ruby/models/musician_search.rb index 24dd2ebb8..849ffbc2a 100644 --- a/ruby/lib/jam_ruby/models/musician_search.rb +++ b/ruby/lib/jam_ruby/models/musician_search.rb @@ -92,6 +92,13 @@ module JamRuby KEY_AGES => [AGE_COUNTS[0]] } + def self.user_search_filter(user) + unless ms = user.musician_search + ms = self.create_search(user) + end + ms.json + end + def self.create_search(user) ms = self.new ms.user = user @@ -219,10 +226,15 @@ module JamRuby rel = self._skills(rel) rel = self._instruments(rel) rel = self._interests(rel) - rel, page = self.pagination(rel, params) rel end + def search_results_page(params={}) + rel = do_search(params) + rel, page = self.pagination(rel, params) + rel.to_json + end + end end diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 29993f644..390aba7ac 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -1577,6 +1577,17 @@ }); } + function getMusicianSearchFilter() { + return $.get("/api/search/musicians.json"); + } + + function postMusicianSearchFilter(query) { + return $.ajax({ + type: "POST", + url: "/api/search/musicians.json?" + $.param(query) + }); + } + function getMount(options) { var id = getId(options); return $.ajax({ @@ -1760,6 +1771,8 @@ this.validateUrlSite = validateUrlSite; this.markRecordedBackingTrackSilent = markRecordedBackingTrackSilent; this.addRecordingTimeline = addRecordingTimeline; + this.getMusicianSearchFilter = getMusicianSearchFilter; + this.postMusicianSearchFilter = postMusicianSearchFilter; return this; }; diff --git a/web/app/assets/javascripts/musician_search_filter.js.coffee b/web/app/assets/javascripts/musician_search_filter.js.coffee new file mode 100644 index 000000000..87622e681 --- /dev/null +++ b/web/app/assets/javascripts/musician_search_filter.js.coffee @@ -0,0 +1,61 @@ +$ = jQuery +context = window +context.JK ||= {}; + +context.JK.MusicianSearchFilter = class MusicianSearchFilter + + constructor: (app) -> + @rest = context.JK.Rest() + @logger = context.JK.logger + @userId = null + @searchFilter = null + + init: () => + @screenBindings = { 'beforeShow': this.beforeShow, 'afterShow': this.afterShow } + + renderSearchFilter: () => + @logger.debug("*** renderSearchFilter: ") + $.when(this.rest.getMusicianSearchFilter()).done (sFilter) => + this.loadSearchFilter(sFilter) + + beforeShow: (data) => + userId = data.id + + afterShow: () => + this.renderSearchFilter() + + loadSearchFilter: (sFilter) => + @searchFilter = sFilter + args = + interests: @searchFilter.interests + status: @searchFilter.skill_level + studio_sessions: @searchFilter.studio_session_count + concert_gigs: @searchFilter.gig_count + + template = context.JK.fillTemplate($('#template-musician-search-filter').html(), args) + + content_root = $('#musician-search-filter-builder') + content_root.html template + this.loadGenres() + this.loadInstruments() + + loadInstruments: () => + + + loadGenres: () => + $('#search-filter-genres').empty() + @rest.getGenres().done (genres) => + $.each genres, (index, genre) => + genreTemplate = $('#template-search-filter-setup-genres').html() + selected = '' + if 0 < @searchFilter.genres.length + genreMatch = $.grep(@searchFilter.genres, (n, i) -> + n.id == genre.id + ) + if genreMatch.length > 0 + selected = 'checked' + genreHtml = context.JK.fillTemplate(genreTemplate, + id: genre.id + description: genre.description + checked: selected) + $('#search-filter-genres').append genreHtml diff --git a/web/app/controllers/api_search_controller.rb b/web/app/controllers/api_search_controller.rb index dfe2fc322..e1ca4903c 100644 --- a/web/app/controllers/api_search_controller.rb +++ b/web/app/controllers/api_search_controller.rb @@ -21,4 +21,15 @@ class ApiSearchController < ApiController @search = Search.text_search(params, current_user) end end + + def musicians + if request.get? + render :json => MusicianSearch.user_search_filter(current_user), :status => 200 + + elsif request.post? + ms = MusicianSearch.user_search_filter(current_user) + render :json => ms.json_search_results(params), :status => 200 + end + end + end diff --git a/web/app/controllers/spikes_controller.rb b/web/app/controllers/spikes_controller.rb index ab6da676d..a4fd2d10a 100644 --- a/web/app/controllers/spikes_controller.rb +++ b/web/app/controllers/spikes_controller.rb @@ -60,4 +60,9 @@ class SpikesController < ApplicationController def recording_source render :layout => 'web' end + + def musician_search_filter + render :layout => 'web' + end + end diff --git a/web/app/views/clients/_musician_search_filter.html.slim b/web/app/views/clients/_musician_search_filter.html.slim new file mode 100644 index 000000000..ccaacf18e --- /dev/null +++ b/web/app/views/clients/_musician_search_filter.html.slim @@ -0,0 +1,51 @@ +div#musician-search-filter-builder + +script#template-musician-search-filter type="text/template" + .field + label Interests: + select.w80 disabled="disabled" name="interests" + option selected="selected" value="{interests}" {interests) + + .field + label Status: + select.w80 disabled="disabled" name="status" + option selected="selected" value="{status}" {status) + + .field + label Studio Sessions Played: + select.w80 disabled="disabled" name="studio_sessions" + option selected="selected" value="{studio_sessions}" {studio_sessions) + + .field + label Concert Gigs Played: + select.w80 disabled="disabled" name="concert_gigs" + option selected="selected" value="{concert_gigs}" {concert_gigs) + + .field + | What instruments can you play? + .profile-instrumentlist.w90 + table.instrument_selector cellpadding="0" cellspacing="6" width="100%" + + .field + label for="search-filter-genres" Genres: + .search-filter-setup-genres + table#search-filter-genres cellpadding="10" cellspacing="6" width="100%" + + .field + label for="filter-ages" Ages: + .filter-setup-ages + table#filter-ages cellpadding="10" cellspacing="6" width="100%" + + +script#musician-search-filter-instrument type="text/template" + tr data-instrument-id="{id}" + td {description + td align="right" width="50%" + select.proficiency_selector name="proficiency" + option value="1" Beginner + option value="2" Intermediate + option value="3" Expert + +script#template-search-filter-setup-genres type="text/template" + tr + td {description diff --git a/web/app/views/spikes/musician_search_filter.html.slim b/web/app/views/spikes/musician_search_filter.html.slim new file mode 100644 index 000000000..6244c4a70 --- /dev/null +++ b/web/app/views/spikes/musician_search_filter.html.slim @@ -0,0 +1,14 @@ += javascript_include_tag "musician_search_filter" += stylesheet_link_tag "client/musician" +#musician_search_spike += render "clients/musician_search_filter" + +javascript: + var initialized = false; + $(document).on('JAMKAZAM_READY', function(e, data) { + setTimeout(function() { + window.musician_search_filter = new JK.MusicianSearchFilter(); + musician_search_filter.init(); + musician_search_filter.afterShow(); + }, 1) + }); diff --git a/web/config/routes.rb b/web/config/routes.rb index e1030964a..cc456384a 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -97,6 +97,7 @@ SampleApp::Application.routes.draw do match '/widgets/download_jam_track', to: 'spikes#download_jam_track' match '/site_validate', to: 'spikes#site_validate' match '/recording_source', to: 'spikes#recording_source' + match '/musician_search_filter', to: 'spikes#musician_search_filter' # junk pages match '/help', to: 'static_pages#help' @@ -429,6 +430,7 @@ SampleApp::Application.routes.draw do # search match '/search' => 'api_search#index', :via => :get + match '/search/musicians' => 'api_search#musicians', :via => [:get, :post] # join requests match '/join_requests/:id' => 'api_join_requests#show', :via => :get, :as => 'api_join_request_detail'