diff --git a/admin/app/admin/monthly_stats.rb b/admin/app/admin/monthly_stats.rb index 1789197aa..0cd599456 100644 --- a/admin/app/admin/monthly_stats.rb +++ b/admin/app/admin/monthly_stats.rb @@ -1,40 +1,35 @@ ActiveAdmin.register_page "Monthly Stats" do menu :parent => 'Reports' - distinct_users = MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', msuh.created_at)::date as month, count(distinct(user_id)) from music_sessions_user_history msuh group by month order by month desc;") - total_session = MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', ms.created_at)::date as month, count(id) from music_sessions ms where started_at is not null group by month order by month desc;") - total_jamtrack_sessions = MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(music_session_id)) from jam_track_sessions jts where session_type = 'session' group by month order by month desc;") - total_webplayer_sessions = MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(id) from jam_track_sessions jts where session_type = 'browser' group by month order by month desc;") - distinct_jamtrack_users = MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(user_id)) from jam_track_sessions jts group by month order by month desc;") - content :title => "Month Stats" do + content :title => "Monthly Stats" do h2 "Distinct Users Playing in Sessions" - table_for distinct_users do + table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', msuh.created_at)::date as month, count(distinct(user_id)) from music_sessions_user_history msuh group by month order by month desc;") do column "Month", Proc.new { |row| Date.parse(row.month).strftime('%B %Y') } column "Users", :count - end + endF h2 "Music Sessions" - table_for total_session do + table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', ms.created_at)::date as month, count(id) from music_sessions ms where started_at is not null group by month order by month desc;") do column "Month", Proc.new { |row| Date.parse(row.month).strftime('%B %Y') } column "Sessions", :count end h2 "Distinct Users Who Played with a JamTrack" - table_for distinct_jamtrack_users do + table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(user_id)) from jam_track_sessions jts group by month order by month desc;") do column "Month", Proc.new { |row| Date.parse(row.month).strftime('%B %Y') } column "Users", :count end h2 "Music Sessions with JamTracks Played" - table_for total_jamtrack_sessions do + table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(distinct(music_session_id)) from jam_track_sessions jts where session_type = 'session' group by month order by month desc;") do column "Month", Proc.new { |row| Date.parse(row.month).strftime('%B %Y') } column "Sessions", :count end h2 "JamTrack Web Player Sessions" - table_for total_webplayer_sessions do + table_for MusicSession.select([:month, :count]).find_by_sql("select date_trunc('month', jts.created_at)::date as month, count(id) from jam_track_sessions jts where session_type = 'browser' group by month order by month desc;") do column "Month", Proc.new { |row| Date.parse(row.month).strftime('%B %Y') } column "Sessions", :count end diff --git a/ruby/lib/jam_ruby/models/teacher.rb b/ruby/lib/jam_ruby/models/teacher.rb index 8306c60ad..690c6cce2 100644 --- a/ruby/lib/jam_ruby/models/teacher.rb +++ b/ruby/lib/jam_ruby/models/teacher.rb @@ -33,110 +33,201 @@ module JamRuby default_scope { includes(:genres) } - class << self - def save_teacher(user, params) - teacher = build_teacher(user, params) - teacher.save - teacher + + def self.index(user, params = {}) + limit = params[:per_page] + limit ||= 20 + limit = limit.to_i + + query = User.joins(:teacher) + + instruments = params[:instruments] + if instruments && !instruments.blank? && instruments.length > 0 + query = query.joins("inner JOIN teachers_instruments AS tinst ON tinst.teacher_id = teachers.id") + .where("tinst.instrument_id IN (?)", instruments) end - def build_teacher(user, params) - # ensure person creating this Teacher is a Musician - unless user && user.musician? - raise JamPermissionError, "must be a musician" - end - - teacher = user.teacher - teacher ||= user.build_teacher() - teacher.user = user - - teacher.website = params[:website] if params.key?(:website) - teacher.biography = params[:biography] if params.key?(:biography) - teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) - - teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) - teacher.years_teaching = params[:years_teaching] if params.key?(:years_teaching) - teacher.years_playing = params[:years_playing] if params.key?(:years_playing) - teacher.teaches_age_lower = params[:teaches_age_lower] if params.key?(:teaches_age_lower) - teacher.teaches_age_upper = params[:teaches_age_upper] if params.key?(:teaches_age_upper) - teacher.website = params[:website] if params.key?(:website) - teacher.biography = params[:biography] if params.key?(:biography) - teacher.teaches_beginner = params[:teaches_beginner] if params.key?(:teaches_beginner) - teacher.teaches_intermediate = params[:teaches_intermediate] if params.key?(:teaches_intermediate) - teacher.teaches_advanced = params[:teaches_advanced] if params.key?(:teaches_advanced) - teacher.prices_per_lesson = params[:prices_per_lesson] if params.key?(:prices_per_lesson) - teacher.prices_per_month = params[:prices_per_month] if params.key?(:prices_per_month) - teacher.lesson_duration_30 = params[:lesson_duration_30] if params.key?(:lesson_duration_30) - teacher.lesson_duration_45 = params[:lesson_duration_45] if params.key?(:lesson_duration_45) - teacher.lesson_duration_60 = params[:lesson_duration_60] if params.key?(:lesson_duration_60) - teacher.lesson_duration_90 = params[:lesson_duration_90] if params.key?(:lesson_duration_90) - teacher.lesson_duration_120 = params[:lesson_duration_120] if params.key?(:lesson_duration_120) - teacher.price_per_lesson_30_cents = params[:price_per_lesson_30_cents] if params.key?(:price_per_lesson_30_cents) - teacher.price_per_lesson_45_cents = params[:price_per_lesson_45_cents] if params.key?(:price_per_lesson_45_cents) - teacher.price_per_lesson_60_cents = params[:price_per_lesson_60_cents] if params.key?(:price_per_lesson_60_cents) - teacher.price_per_lesson_90_cents = params[:price_per_lesson_90_cents] if params.key?(:price_per_lesson_90_cents) - teacher.price_per_lesson_120_cents = params[:price_per_lesson_120_cents] if params.key?(:price_per_lesson_120_cents) - teacher.price_per_month_30_cents = params[:price_per_month_30_cents] if params.key?(:price_per_month_30_cents) - teacher.price_per_month_45_cents = params[:price_per_month_45_cents] if params.key?(:price_per_month_45_cents) - teacher.price_per_month_60_cents = params[:price_per_month_60_cents] if params.key?(:price_per_month_60_cents) - teacher.price_per_month_90_cents = params[:price_per_month_90_cents] if params.key?(:price_per_month_90_cents) - teacher.price_per_month_120_cents = params[:price_per_month_120_cents] if params.key?(:price_per_month_120_cents) - - # Many-to-many relations: - if params.key?(:genres) - genres = params[:genres] - genres = [] if genres.nil? - teacher.genres = genres.collect{|genre_id| Genre.find(genre_id)} - end - if params.key?(:instruments) - instruments = params[:instruments] - instruments = [] if instruments.nil? - teacher.instruments = instruments.collect{|instrument_id| Instrument.find(instrument_id)} - end - if params.key?(:subjects) - subjects = params[:subjects] - subjects = [] if subjects.nil? - teacher.subjects = subjects.collect{|subject_id| Subject.find(subject_id)} - end - if params.key?(:languages) - languages = params[:languages] - languages = [] if languages.nil? - teacher.languages = languages.collect{|language_id| Language.find(language_id)} - end - - # Experience: - [:teaching, :education, :award].each do |experience_type| - key = "experiences_#{experience_type}".to_sym - if params.key?(key) - list = params[key] - list = [] if list.nil? - experiences = list.collect do |exp| - TeacherExperience.new( - name: exp[:name], - experience_type: experience_type, - organization: exp[:organization], - start_year: exp[:start_year], - end_year: exp[:end_year] - ) - end # collect - - # we blindly destroy/recreate on every resubmit - previous = teacher.send("#{key.to_s}") - previous.destroy_all - - # Dynamically call the appropriate method (just setting the - # value doesn't result in the behavior we need) - teacher.send("#{key.to_s}=", experiences) - end # if - end # do - - # How to validate: - teacher.validate_introduction = !!params[:validate_introduction] - teacher.validate_basics = !!params[:validate_basics] - teacher.validate_pricing = !!params[:validate_pricing] - - teacher + subjects = params[:subjects] + if subjects && !subjects.blank? && subjects.length > 0 + query = query.joins("inner JOIN teachers_subjects AS tsubjs ON tsubjs.teacher_id = teachers.id") + .where('tsubjs.subject_id IN (?)', subjects) end + + genres = params[:genres] + if genres && !genres.blank? && genres.length > 0 + query = query.joins("inner JOIN teachers_genres AS tgenres ON tgenres.teacher_id = teachers.id") + .where('tgenres.genre_id IN (?)', genres) + end + + country = params[:country] + if country && country.length > 0 + query = query.where(country: country) + end + + region = params[:region] + if region && region.length > 0 + query = query.where(state: region) + end + + languages = params[:languages] + if languages && !languages.blank? && languages.length > 0 + query= query.joins("inner JOIN teachers_languages AS tlang ON tlang.teacher_id = teachers.id") + .where('tlang.language_id IN (?)', languages) + end + + years_teaching = params[:years_teaching].to_i + if years_teaching && years_teaching > 0 + query = query.where('years_teaching >= ?', years_teaching) + end + + teaches_beginner = params[:teaches_beginner] + teaches_intermediate = params[:teaches_intermediate] + teaches_advanced = params[:teaches_advanced] + + if teaches_beginner || teaches_intermediate || teaches_advanced + + clause = '' + + if teaches_beginner + clause << 'teaches_beginner = true' + end + if teaches_intermediate + if clause.length > 0 + clause << ' OR ' + end + clause << 'teaches_intermediate = true' + end + if teaches_advanced + if clause.length > 0 + clause << ' OR ' + end + clause << 'teaches_advanced = true' + end + query = query.where(clause) + end + + student_age = params[:student_age].to_i + if student_age && student_age > 0 + query = query.where("teaches_age_lower <= ? AND (CASE WHEN teaches_age_upper = 0 THEN true ELSE teaches_age_upper >= ? END)", student_age, student_age) + end + + current_page = params[:page].nil? ? 1 : params[:page].to_i + next_page = current_page + 1 + + # will_paginate gem + query = query.paginate(:page => current_page, :per_page => limit) + + if query.length == 0 # no more results + { query: query, next_page: nil} + elsif query.length < limit # no more results + { query: query, next_page: nil} + else + { query: query, next_page: next_page } + end + end + + def self.save_teacher(user, params) + teacher = build_teacher(user, params) + teacher.save + teacher + end + + def self.build_teacher(user, params) + # ensure person creating this Teacher is a Musician + unless user && user.musician? + raise JamPermissionError, "must be a musician" + end + + teacher = user.teacher + teacher ||= user.build_teacher() + teacher.user = user + + teacher.website = params[:website] if params.key?(:website) + teacher.biography = params[:biography] if params.key?(:biography) + teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) + + teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) + teacher.years_teaching = params[:years_teaching] if params.key?(:years_teaching) + teacher.years_playing = params[:years_playing] if params.key?(:years_playing) + teacher.teaches_age_lower = params[:teaches_age_lower] if params.key?(:teaches_age_lower) + teacher.teaches_age_upper = params[:teaches_age_upper] if params.key?(:teaches_age_upper) + teacher.website = params[:website] if params.key?(:website) + teacher.biography = params[:biography] if params.key?(:biography) + teacher.teaches_beginner = params[:teaches_beginner] if params.key?(:teaches_beginner) + teacher.teaches_intermediate = params[:teaches_intermediate] if params.key?(:teaches_intermediate) + teacher.teaches_advanced = params[:teaches_advanced] if params.key?(:teaches_advanced) + teacher.prices_per_lesson = params[:prices_per_lesson] if params.key?(:prices_per_lesson) + teacher.prices_per_month = params[:prices_per_month] if params.key?(:prices_per_month) + teacher.lesson_duration_30 = params[:lesson_duration_30] if params.key?(:lesson_duration_30) + teacher.lesson_duration_45 = params[:lesson_duration_45] if params.key?(:lesson_duration_45) + teacher.lesson_duration_60 = params[:lesson_duration_60] if params.key?(:lesson_duration_60) + teacher.lesson_duration_90 = params[:lesson_duration_90] if params.key?(:lesson_duration_90) + teacher.lesson_duration_120 = params[:lesson_duration_120] if params.key?(:lesson_duration_120) + teacher.price_per_lesson_30_cents = params[:price_per_lesson_30_cents] if params.key?(:price_per_lesson_30_cents) + teacher.price_per_lesson_45_cents = params[:price_per_lesson_45_cents] if params.key?(:price_per_lesson_45_cents) + teacher.price_per_lesson_60_cents = params[:price_per_lesson_60_cents] if params.key?(:price_per_lesson_60_cents) + teacher.price_per_lesson_90_cents = params[:price_per_lesson_90_cents] if params.key?(:price_per_lesson_90_cents) + teacher.price_per_lesson_120_cents = params[:price_per_lesson_120_cents] if params.key?(:price_per_lesson_120_cents) + teacher.price_per_month_30_cents = params[:price_per_month_30_cents] if params.key?(:price_per_month_30_cents) + teacher.price_per_month_45_cents = params[:price_per_month_45_cents] if params.key?(:price_per_month_45_cents) + teacher.price_per_month_60_cents = params[:price_per_month_60_cents] if params.key?(:price_per_month_60_cents) + teacher.price_per_month_90_cents = params[:price_per_month_90_cents] if params.key?(:price_per_month_90_cents) + teacher.price_per_month_120_cents = params[:price_per_month_120_cents] if params.key?(:price_per_month_120_cents) + + # Many-to-many relations: + if params.key?(:genres) + genres = params[:genres] + genres = [] if genres.nil? + teacher.genres = genres.collect{|genre_id| Genre.find(genre_id)} + end + if params.key?(:instruments) + instruments = params[:instruments] + instruments = [] if instruments.nil? + teacher.instruments = instruments.collect{|instrument_id| Instrument.find(instrument_id)} + end + if params.key?(:subjects) + subjects = params[:subjects] + subjects = [] if subjects.nil? + teacher.subjects = subjects.collect{|subject_id| Subject.find(subject_id)} + end + if params.key?(:languages) + languages = params[:languages] + languages = [] if languages.nil? + teacher.languages = languages.collect{|language_id| Language.find(language_id)} + end + + # Experience: + [:teaching, :education, :award].each do |experience_type| + key = "experiences_#{experience_type}".to_sym + if params.key?(key) + list = params[key] + list = [] if list.nil? + experiences = list.collect do |exp| + TeacherExperience.new( + name: exp[:name], + experience_type: experience_type, + organization: exp[:organization], + start_year: exp[:start_year], + end_year: exp[:end_year] + ) + end # collect + + # we blindly destroy/recreate on every resubmit + previous = teacher.send("#{key.to_s}") + previous.destroy_all + + # Dynamically call the appropriate method (just setting the + # value doesn't result in the behavior we need) + teacher.send("#{key.to_s}=", experiences) + end # if + end # do + + # How to validate: + teacher.validate_introduction = !!params[:validate_introduction] + teacher.validate_basics = !!params[:validate_basics] + teacher.validate_pricing = !!params[:validate_pricing] + + teacher end def offer_pricing diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 27435b204..dd4781571 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -94,6 +94,10 @@ FactoryGirl.define do end end + factory :teacher, :class => JamRuby::Teacher do + association :user, factory: :user + end + factory :musician_instrument, :class => JamRuby::MusicianInstrument do instrument { JamRuby::Instrument.find('electric guitar') } proficiency_level 1 diff --git a/ruby/spec/jam_ruby/models/teacher_spec.rb b/ruby/spec/jam_ruby/models/teacher_spec.rb index 061f7fe3a..7ec2cf2e5 100644 --- a/ruby/spec/jam_ruby/models/teacher_spec.rb +++ b/ruby/spec/jam_ruby/models/teacher_spec.rb @@ -12,12 +12,177 @@ describe Teacher do let(:instrument1) { FactoryGirl.create(:instrument, :description => 'a great instrument')} let(:instrument2) { FactoryGirl.create(:instrument, :description => 'an ok instrument')} + describe "index" do + it "no params" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil)[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "instruments" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {instruments: ['acoustic guitar']})[:query] + teachers.length.should eq 0 + + teacher.instruments << Instrument.find('acoustic guitar') + teacher.save! + teachers = Teacher.index(nil, {instruments: ['acoustic guitar']})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teacher.instruments << Instrument.find('electric guitar') + teacher.save! + teachers = Teacher.index(nil, {instruments: ['acoustic guitar']})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "subjects" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {subjects: ['music-theory']})[:query] + teachers.length.should eq 0 + + teacher.subjects << Subject.find('music-theory') + teacher.save! + teachers = Teacher.index(nil, {subjects: ['music-theory']})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "genres" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {genres: ['ambient']})[:query] + teachers.length.should eq 0 + + teacher.genres << Genre.find('ambient') + teacher.save! + teachers = Teacher.index(nil, {genres: ['ambient']})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + + it "languages" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {languages: ['EN']})[:query] + teachers.length.should eq 0 + + teacher.languages << Language.find('EN') + teacher.save! + teachers = Teacher.index(nil, {languages: ['EN']})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "country" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {country: 'DO'})[:query] + teachers.length.should eq 0 + + teacher.user.country = 'DO' + teacher.user.save! + teachers = Teacher.index(nil, {country: 'DO'})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "region" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {region: 'HE'})[:query] + teachers.length.should eq 0 + + teacher.user.state = 'HE' + teacher.user.save! + teachers = Teacher.index(nil, {region: 'HE'})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "years_teaching" do + teacher = FactoryGirl.create(:teacher, years_teaching: 5) + teachers = Teacher.index(nil, {years_teaching: 10})[:query] + teachers.length.should eq 0 + + teachers = Teacher.index(nil, {years_teaching: 2})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "teaches beginner/intermediate/advanced" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {teaches_beginner: true})[:query] + teachers.length.should eq 0 + + teacher.teaches_beginner = true + teacher.save! + teachers = Teacher.index(nil, {teaches_beginner: true})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teachers = Teacher.index(nil, {teaches_intermediate: true})[:query] + teachers.length.should eq 0 + + teachers = Teacher.index(nil, {teaches_beginner: true, teaches_intermediate: true})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teachers = Teacher.index(nil, {teaches_beginner: true, teaches_intermediate: true, teaches_advanced: true})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + end + + it "student_age" do + teacher = FactoryGirl.create(:teacher) + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 1 + + teacher.teaches_age_lower = 5 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teacher.teaches_age_lower = 6 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 0 + + teacher.teaches_age_lower = 4 + teacher.teaches_age_upper = 6 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teacher.teaches_age_lower = 0 + teacher.teaches_age_upper = 5 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teacher.teaches_age_lower = 0 + teacher.teaches_age_upper = 6 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 1 + teachers[0].should eq(teacher.user) + + teacher.teaches_age_lower = 0 + teacher.teaches_age_upper = 4 + teacher.save! + teachers = Teacher.index(nil, {student_age: 5})[:query] + teachers.length.should eq 0 + end + end + BIO = "Once a man learned a guitar." GOOD_YOUTUBE_URL = "http://youtube.com/watch?v=1234567890" describe "can create" do it "a simple teacher" do teacher = Teacher.new - teacher.user = user; + teacher.user = user teacher.biography = BIO teacher.introductory_video = GOOD_YOUTUBE_URL teacher.save.should be_true diff --git a/ruby/spec/spec_helper.rb b/ruby/spec/spec_helper.rb index 7f189e159..7a4ab16e6 100644 --- a/ruby/spec/spec_helper.rb +++ b/ruby/spec/spec_helper.rb @@ -95,13 +95,13 @@ end config.before(:suite) do DatabaseCleaner.strategy = :transaction - DatabaseCleaner.clean_with(:deletion, {pre_count: true, reset_ids:false, :except => %w[gift_card_types instruments genres icecast_server_groups jamcompany jamisp geoipblocks geoipisp geoiplocations cities regions countries generic_state spatial_ref_sys] }) + DatabaseCleaner.clean_with(:deletion, {pre_count: true, reset_ids:false, :except => %w[gift_card_types instruments languages subjects genres icecast_server_groups jamcompany jamisp geoipblocks geoipisp geoiplocations cities regions countries generic_state spatial_ref_sys] }) end config.around(:each) do |example| # set no_transaction: true as metadata on your test to use deletion strategy instead if example.metadata[:no_transaction] - DatabaseCleaner.strategy = :deletion, {pre_count: true, reset_ids:false, :except => %w[gift_card_types instruments genres icecast_server_groups jamcompany jamisp geoipblocks geoipisp geoiplocations cities regions countries generic_state spatial_ref_sys] } + DatabaseCleaner.strategy = :deletion, {pre_count: true, reset_ids:false, :except => %w[gift_card_types instruments languages subjects genres icecast_server_groups jamcompany jamisp geoipblocks geoipisp geoiplocations cities regions countries generic_state spatial_ref_sys] } else DatabaseCleaner.strategy = :transaction end diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 219df4f2c..953b9e0a7 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -1974,6 +1974,15 @@ }); } + function searchTeachers(query) { + return $.ajax({ + type: "GET", + url: "/api/teachers?" + $.param(query), + dataType: "json", + contentType: 'application/json' + }); + } + function getMusicianSearchFilter(query) { var qarg = query === undefined ? '' : query; return $.get("/api/search/musicians.json?"+qarg); @@ -2286,6 +2295,7 @@ this.updateBillingInfo = updateBillingInfo; this.placeOrder = placeOrder; this.searchMusicians = searchMusicians; + this.searchTeachers = searchTeachers; this.resendBandInvitation = resendBandInvitation; this.getMount = getMount; this.createSourceChange = createSourceChange; diff --git a/web/app/assets/javascripts/react-components.js b/web/app/assets/javascripts/react-components.js index 9e82ac707..8c4e9b8db 100644 --- a/web/app/assets/javascripts/react-components.js +++ b/web/app/assets/javascripts/react-components.js @@ -18,6 +18,9 @@ //= require ./react-components/stores/MixerStore //= require ./react-components/stores/ConfigureTracksStore //= require ./react-components/stores/JamTrackStore +//= require ./react-components/stores/LocationStore +//= require ./react-components/stores/TeacherSearchStore +//= require ./react-components/stores/TeacherSearchResultsStore //= require ./react-components/stores/SessionNotificationStore //= require ./react-components/stores/MediaPlaybackStore //= require ./react-components/stores/BrowserMediaPlaybackStore diff --git a/web/app/assets/javascripts/react-components/AgeRangeList.js.jsx.coffee b/web/app/assets/javascripts/react-components/AgeRangeList.js.jsx.coffee index 615a13514..84037a885 100644 --- a/web/app/assets/javascripts/react-components/AgeRangeList.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/AgeRangeList.js.jsx.coffee @@ -4,11 +4,15 @@ logger = context.JK.logger @AgeRangeList = React.createClass({ ages: [0, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100] + agesJsx: [] + propTypes: { + onItemChanged: React.PropTypes.func.isRequired + } - componentDidMount: () -> + componentWillMount: () -> @agesJsx = [] for age in @ages - @agesJsx.push(``) + @agesJsx.push(``) getInitialState: () -> {selectedAge:@props.selectedAge} diff --git a/web/app/assets/javascripts/react-components/GenreCheckBoxList.js.jsx.coffee b/web/app/assets/javascripts/react-components/GenreCheckBoxList.js.jsx.coffee index 4e877aca9..3f641618f 100644 --- a/web/app/assets/javascripts/react-components/GenreCheckBoxList.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/GenreCheckBoxList.js.jsx.coffee @@ -6,6 +6,13 @@ logger = context.JK.logger mixins: [Reflux.listenTo(@GenreStore,"onGenresChanged")] + propTypes: { + onItemChanged: React.PropTypes.func.isRequired + } + + getDefaultProps: () -> + selectedGenres: [] + getInitialState:() -> {genres: []} diff --git a/web/app/assets/javascripts/react-components/InstrumentCheckBoxList.js.jsx.coffee b/web/app/assets/javascripts/react-components/InstrumentCheckBoxList.js.jsx.coffee index 9078d5b4d..996e9c2d5 100644 --- a/web/app/assets/javascripts/react-components/InstrumentCheckBoxList.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/InstrumentCheckBoxList.js.jsx.coffee @@ -6,6 +6,13 @@ logger = context.JK.logger mixins: [Reflux.listenTo(@InstrumentStore,"onInstrumentsChanged")] + propTypes: { + onItemChanged: React.PropTypes.func.isRequired + } + + getDefaultProps: () -> + selectedInstruments: [] + getInitialState: () -> {instruments: []} diff --git a/web/app/assets/javascripts/react-components/LanguageCheckBoxList.js.jsx.coffee b/web/app/assets/javascripts/react-components/LanguageCheckBoxList.js.jsx.coffee index 59fa3140f..6f2660678 100644 --- a/web/app/assets/javascripts/react-components/LanguageCheckBoxList.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/LanguageCheckBoxList.js.jsx.coffee @@ -6,6 +6,13 @@ logger = context.JK.logger mixins: [Reflux.listenTo(@LanguageStore,"onLanguagesChanged")] + propTypes: { + onItemChanged: React.PropTypes.func.isRequired + } + + getDefaultProps: () -> + selectedLanguages: [] + getInitialState: () -> {languages: []} diff --git a/web/app/assets/javascripts/react-components/SelectLocation.js.jsx.coffee b/web/app/assets/javascripts/react-components/SelectLocation.js.jsx.coffee new file mode 100644 index 000000000..e6a097dcd --- /dev/null +++ b/web/app/assets/javascripts/react-components/SelectLocation.js.jsx.coffee @@ -0,0 +1,62 @@ +context = window +rest = window.JK.Rest() +logger = context.JK.logger + +@SelectLocation = React.createClass({ + + mixins: [Reflux.listenTo(@LocationStore,"onLocationsChanged")] + + propTypes: { + onItemChanged: React.PropTypes.func.isRequired + } + + getInitialState:() -> + {selectedCountry: null, countries:{US: {name: 'United States', region: null}}} + + onLocationsChanged: (countries) -> + @setState({countries: countries}) + + onCountryChanged: (e) -> + val = $(e.target).val() + @changed(val, null) + @setState({selectedCountry: val, selectedRegion: null }) + + if val? + LocationActions.selectCountry(val) + + onRegionChanged: (e) -> + val = $(e.target).val() + @changed(@state.selectedCountry, val) + @setState({selectedRegion: val }) + + changed: (country, region) -> + if country == '' + country = null + + if region == '' + region = null + + @props.onItemChanged(country, region) + + render: () -> + countries = [``] + for countryId, countryInfo of @state.countries + countries.push(``) + + country = @state.countries[@state.selectedCountry] + + regions = [``] + + + if country? && country.regions + for region in country.regions + regions.push(``) + + disabled = regions.length == 1 + `