From b1b2d3ad2425bd47370c240063adad3e351eb50a Mon Sep 17 00:00:00 2001 From: Seth Call Date: Tue, 31 Mar 2015 16:17:17 -0500 Subject: [PATCH] * VRFS-2869 - band landing page --- ruby/lib/jam_ruby/models/jam_track.rb | 4 + web/app/assets/javascripts/jam_rest.js | 10 ++ ....css.scss => individual_jamtrack.css.scss} | 7 +- .../individual_jamtrack_band.css.scss | 32 ++++++ .../landings/landing_page_new.css.scss | 1 + .../controllers/api_jam_tracks_controller.rb | 8 +- web/app/controllers/landings_controller.rb | 9 +- web/app/views/api_jam_tracks/show.rabl | 2 +- .../api_jam_tracks/show_with_artist_info.rabl | 7 ++ ...tml.slim => individual_jamtrack.html.slim} | 8 +- .../individual_jamtrack_band.html.slim | 106 ++++++++++++++++++ web/config/routes.rb | 4 +- .../features/individual_jamtrack_band_spec.rb | 103 +++++++++++++++++ web/spec/features/individual_jamtrack_spec.rb | 2 +- 14 files changed, 291 insertions(+), 12 deletions(-) rename web/app/assets/stylesheets/landings/{individual_song.css.scss => individual_jamtrack.css.scss} (73%) create mode 100644 web/app/assets/stylesheets/landings/individual_jamtrack_band.css.scss create mode 100644 web/app/views/api_jam_tracks/show_with_artist_info.rabl rename web/app/views/landings/{individual_song.html.slim => individual_jamtrack.html.slim} (95%) create mode 100644 web/app/views/landings/individual_jamtrack_band.html.slim create mode 100644 web/spec/features/individual_jamtrack_band_spec.rb diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index 5426b08b7..a4d293276 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -103,6 +103,10 @@ module JamRuby warnings.join(',') end + def band_jam_track_count + JamTrack.where(original_artist: original_artist).count + end + class << self # @return array[artist_name(string)] def all_artists diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 0181bd8af..43dff7227 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -1443,6 +1443,15 @@ }); } + function getJamTrackWithArtistInfo(options) { + return $.ajax({ + type: "GET", + url: '/api/jamtracks/band/' + options['plan_code'] + '?' + $.param(options), + dataType: "json", + contentType: 'application/json' + }); + } + function getJamtracks(options) { return $.ajax({ type: "GET", @@ -1752,6 +1761,7 @@ this.getLatencyTester = getLatencyTester; this.updateAudioLatency = updateAudioLatency; this.getJamTrack = getJamTrack; + this.getJamTrackWithArtistInfo = getJamTrackWithArtistInfo; this.getJamtracks = getJamtracks; this.getPurchasedJamTracks = getPurchasedJamTracks; this.getPaymentHistory = getPaymentHistory; diff --git a/web/app/assets/stylesheets/landings/individual_song.css.scss b/web/app/assets/stylesheets/landings/individual_jamtrack.css.scss similarity index 73% rename from web/app/assets/stylesheets/landings/individual_song.css.scss rename to web/app/assets/stylesheets/landings/individual_jamtrack.css.scss index 4aebaa6c3..6111876ee 100644 --- a/web/app/assets/stylesheets/landings/individual_song.css.scss +++ b/web/app/assets/stylesheets/landings/individual_jamtrack.css.scss @@ -1,4 +1,4 @@ -body.web.landing_jamtrack.individual { +body.web.landing_jamtrack.individual_jamtrack { .previews { margin-top:10px; @@ -11,6 +11,11 @@ body.web.landing_jamtrack.individual { margin-top: 20px; } + .browse-jamtracks-wrapper { + text-align:center; + width:90%; + } + .jam-track-preview-holder { margin-bottom: 7px; diff --git a/web/app/assets/stylesheets/landings/individual_jamtrack_band.css.scss b/web/app/assets/stylesheets/landings/individual_jamtrack_band.css.scss new file mode 100644 index 000000000..db25181b1 --- /dev/null +++ b/web/app/assets/stylesheets/landings/individual_jamtrack_band.css.scss @@ -0,0 +1,32 @@ +body.web.landing_jamtrack.individual_jamtrack_band { + + .previews { + margin-top:10px; + } + .jamtrack-reasons { + margin: 10px 0 0 20px; + } + + .white-bordered-button { + margin-top: 20px; + } + + .browse-jamtracks-wrapper { + text-align:center; + width:90%; + } + + .jam-track-preview-holder { + + margin-bottom: 7px; + float: left; + + &[data-track-type="Master"] { + width: 100%; + } + + &[data-track-type="Track"] { + width: 50%; + } + } +} \ No newline at end of file diff --git a/web/app/assets/stylesheets/landings/landing_page_new.css.scss b/web/app/assets/stylesheets/landings/landing_page_new.css.scss index 7a9b6067c..d8938ec15 100644 --- a/web/app/assets/stylesheets/landings/landing_page_new.css.scss +++ b/web/app/assets/stylesheets/landings/landing_page_new.css.scss @@ -23,6 +23,7 @@ body.web.landing_page { .landing-tag { left:50%; + text-align:center; } p, ul, li { font-size:14px; diff --git a/web/app/controllers/api_jam_tracks_controller.rb b/web/app/controllers/api_jam_tracks_controller.rb index e40598fd5..fd8019462 100644 --- a/web/app/controllers/api_jam_tracks_controller.rb +++ b/web/app/controllers/api_jam_tracks_controller.rb @@ -1,8 +1,8 @@ class ApiJamTracksController < ApiController # have to be signed in currently to see this screen - before_filter :api_signed_in_user, :except => [:index, :show] - before_filter :api_any_user, :only => [:index, :show] + before_filter :api_signed_in_user, :except => [:index, :show, :show_with_artist_info] + before_filter :api_any_user, :only => [:index, :show, :show_with_artist_info] before_filter :lookup_jam_track_right, :only => [:download,:enqueue, :show_jam_track_right] respond_to :json @@ -11,6 +11,10 @@ class ApiJamTracksController < ApiController @jam_track = JamTrack.find_by_plan_code!(params[:plan_code]) end + def show_with_artist_info + @jam_track = JamTrack.find_by_plan_code!(params[:plan_code]) + end + def index data = JamTrack.index(params, any_user) @jam_tracks, @next = data[0], data[1] diff --git a/web/app/controllers/landings_controller.rb b/web/app/controllers/landings_controller.rb index 7ecd72208..a8ba721be 100644 --- a/web/app/controllers/landings_controller.rb +++ b/web/app/controllers/landings_controller.rb @@ -66,11 +66,16 @@ class LandingsController < ApplicationController render 'watch_overview_tight', layout: 'web' end - def individual_song + def individual_jamtrack gon.jam_track_plan_code = params[:plan_code] ? "jamtrack-" + params[:plan_code] : nil + render 'individual_jamtrack', layout: 'web' + end - render 'individual_song', layout: 'web' + def individual_jamtrack_band + gon.jam_track_plan_code = params[:plan_code] ? "jamtrack-" + params[:plan_code] : nil + + render 'individual_jamtrack_band', layout: 'web' end end diff --git a/web/app/views/api_jam_tracks/show.rabl b/web/app/views/api_jam_tracks/show.rabl index e616306e2..65d887ea8 100644 --- a/web/app/views/api_jam_tracks/show.rabl +++ b/web/app/views/api_jam_tracks/show.rabl @@ -1,6 +1,6 @@ object @jam_track -attributes :id, :name, :description, :recording_type, :original_artist, :songwriter, :publisher, :sales_region, :price, :version, :duration +attributes :id, :name, :description, :recording_type, :original_artist, :songwriter, :publisher, :sales_region, :price, :version node :genres do |item| [item.genre.description] # XXX: need to return single genre; not array diff --git a/web/app/views/api_jam_tracks/show_with_artist_info.rabl b/web/app/views/api_jam_tracks/show_with_artist_info.rabl new file mode 100644 index 000000000..76dc3b68b --- /dev/null +++ b/web/app/views/api_jam_tracks/show_with_artist_info.rabl @@ -0,0 +1,7 @@ +object @jam_track + +attributes :band_jam_track_count + +node do |jam_track| + partial "api_jam_tracks/show", object: @jam_track +end diff --git a/web/app/views/landings/individual_song.html.slim b/web/app/views/landings/individual_jamtrack.html.slim similarity index 95% rename from web/app/views/landings/individual_song.html.slim rename to web/app/views/landings/individual_jamtrack.html.slim index 12f7b4b3b..39bba98e6 100644 --- a/web/app/views/landings/individual_song.html.slim +++ b/web/app/views/landings/individual_jamtrack.html.slim @@ -1,4 +1,4 @@ -- provide(:page_name, 'landing_page full landing_jamtrack individual') +- provide(:page_name, 'landing_page full landing_jamtrack individual_jamtrack') .two_by_two .row @@ -43,7 +43,7 @@ javascript: "use strict"; context.JK = context.JK || {}; - context.JK.IndividualSong = function (app) { + context.JK.IndividualJamTrack = function (app) { var rest = context.JK.Rest(); var logger = context.JK.logger; @@ -66,7 +66,7 @@ javascript: $previews.append($element); - new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: true}) + new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false}) }) $previews.append('
') @@ -90,6 +90,6 @@ javascript: })(window, jQuery); $(document).on('JAMKAZAM_READY', function(e, data) { - var song = new JK.IndividualSong(data.app); + var song = new JK.IndividualJamTrack(data.app); song.initialize(); }) diff --git a/web/app/views/landings/individual_jamtrack_band.html.slim b/web/app/views/landings/individual_jamtrack_band.html.slim new file mode 100644 index 000000000..986e5c21a --- /dev/null +++ b/web/app/views/landings/individual_jamtrack_band.html.slim @@ -0,0 +1,106 @@ +- provide(:page_name, 'landing_page full landing_jamtrack individual_jamtrack_band') + +.two_by_two + .row + .column + h1 + | We Have  + span.jamtrack_band_info + |   + span.jamtrack_noun JamTracks + span.check-it-out , Check One Out! + p Click the play buttons below to hear the master mix and each fully isolated track. All are included in each single JamTrack. + .previews + .column + h1 See What You Can Do With JamTracks + .video-wrapper + .video-container + iframe src="//www.youtube.com/embed/gAJAIHMyois" frameborder="0" allowfullscreen + br clear="all" + .row + .column + h1 + | Get Your First JamTrack Free Now! + p Click the GET A JAMTRACK FREE button below. Browse to find the one you want. Click Add to cart, and we'll apply a credit during checkout to make this first one free! We're confident you'll be back for more. + .browse-jamtracks-wrapper + a.white-bordered-button href="/client#/jamtrack" GET A JAMTRACK FREE! + .column + h1 Why Are JamTracks Different & Better? + p + | JamTracks are the best way to play with your favorite music.  + | Unlike traditional backing tracks, JamTracks are complete multitrack recordings,  + | with fully isolated tracks for each part. Used with the free JamKazam app/service, you can: + ul.jamtrack-reasons + li - Solo just the individual track you want to play to hear and learn it + li - Mute just the track you want to play, and play along with the rest + li - Make audio recordings and share them via Facebook or URL + li - Make video recordings and share them via YouTube or URL + li - And even go online to play JamTracks with others in real time! + br clear="all" + br clear="all" + +javascript: + (function (context, $) { + + "use strict"; + + context.JK = context.JK || {}; + context.JK.IndividualJamTrackBand = function (app) { + + var rest = context.JK.Rest(); + var logger = context.JK.logger; + var $page = null; + var $jamTrackBandInfo = null; + var $jamTrackNoun = null; + var $previews = null; + var $jamTracksButton = null; + var $checkItOut = null; + + function fetchJamTrack() { + rest.getJamTrackWithArtistInfo({plan_code: gon.jam_track_plan_code}) + .done(function (jam_track) { + logger.debug("jam_track", jam_track) + + $jamTrackBandInfo.text(jam_track.band_jam_track_count + ' ' + jam_track.original_artist); + $jamTracksButton.attr('href', '/client?artist=' + jam_track.original_artist + '#/jamtrack') + + if(jam_track.band_jam_track_count == 1) { + $jamTrackNoun.text('JamTrack') + $checkItOut.text(', Check It Out!') + } + context._.each(jam_track.tracks, function (track) { + + var $element = $('
') + + $previews.append($element); + + new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false}) + }) + + $previews.append('
') + }) + .fail(function () { + app.notify({title: 'Unable to fetch JamTrack', text: "Please refresh the page or try again later."}) + }) + + } + function initialize() { + + $page = $('body') + $jamTrackBandInfo = $page.find('.jamtrack_band_info') + $previews = $page.find('.previews') + $jamTracksButton = $page.find('.browse-jamtracks-wrapper .white-bordered-button') + $jamTrackNoun = $page.find('.jamtrack_noun') + $checkItOut = $page.find('.check-it-out') + + fetchJamTrack(); + } + + this.initialize = initialize; + } + })(window, jQuery); + + $(document).on('JAMKAZAM_READY', function(e, data) { + var song = new JK.IndividualJamTrackBand(data.app); + song.initialize(); + }) diff --git a/web/config/routes.rb b/web/config/routes.rb index 74ad6cd38..15eeeb0ac 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -30,7 +30,8 @@ SampleApp::Application.routes.draw do match '/landing/kick2', to: 'landings#watch_overview_kick2', via: :get, as: 'landing_kick2' match '/landing/kick3', to: 'landings#watch_overview_kick3', via: :get, as: 'landing_kick3' match '/landing/kick4', to: 'landings#watch_overview_kick4', via: :get, as: 'landing_kick4' - match '/landing/jamtracks/:plan_code', to: 'landings#individual_song', via: :get, as: 'individual_song' + match '/landing/jamtracks/:plan_code', to: 'landings#individual_jamtrack', via: :get, as: 'individual_jamtrack' + match '/landing/jamtracks/band/:plan_code', to: 'landings#individual_jamtrack_band', via: :get, as: 'individual_jamtrack_band' # oauth match '/auth/:provider/callback', :to => 'sessions#oauth_callback' @@ -207,6 +208,7 @@ SampleApp::Application.routes.draw do # Jamtracks match '/jamtracks/:plan_code' => 'api_jam_tracks#show', :via => :get, :as => 'api_jam_tracks_show' + match '/jamtracks/band/:plan_code' => 'api_jam_tracks#show_with_artist_info', :via => :get, :as => 'api_jam_tracks_show_with_artist_info' match '/jamtracks' => 'api_jam_tracks#index', :via => :get, :as => 'api_jam_tracks_list' match '/jamtracks/purchased' => 'api_jam_tracks#purchased', :via => :get, :as => 'api_jam_tracks_purchased' match '/jamtracks/download/:id' => 'api_jam_tracks#download', :via => :get, :as => 'api_jam_tracks_download' diff --git a/web/spec/features/individual_jamtrack_band_spec.rb b/web/spec/features/individual_jamtrack_band_spec.rb new file mode 100644 index 000000000..934762fbf --- /dev/null +++ b/web/spec/features/individual_jamtrack_band_spec.rb @@ -0,0 +1,103 @@ +require 'spec_helper' + +describe "Individual JamTrack Band", :js => true, :type => :feature, :capybara_feature => true do + + subject { page } + + before(:all) do + ShoppingCart.delete_all + JamTrackRight.delete_all + JamTrack.delete_all + JamTrackTrack.delete_all + JamTrackLicensor.delete_all + end + + let(:user) { FactoryGirl.create(:user) } + let(:jamtrack_acdc_backinblack) { @jamtrack_acdc_backinblack } + let(:jamtrack_pearljam_evenflow) { @jamtrack_pearljam_evenflow } + + let(:billing_info) { + { + first_name: 'Seth', + last_name: 'Call', + address1: '10704 Buckthorn Drive', + city: 'Austin', + state: 'Texas', + country: 'US', + zip: '78759', + number: '4111111111111111', + month: '08', + year: '2017', + verification_value: '012' + } + } + + def create_account(user, billing_info) + @recurlyClient.create_account(user, billing_info) + @created_accounts << user + end + + + before(:all) do + + @recurlyClient = RecurlyClient.new + @created_accounts = [] + + @jamtrack_acdc_backinblack = FactoryGirl.create(:jam_track, name: 'Back in Black', original_artist: 'AC/DC', sales_region: 'United States', make_track: true, plan_code: 'jamtrack-acdc-backinblack') + @jamtrack_pearljam_evenflow = FactoryGirl.create(:jam_track, name: 'Even Flow', original_artist: 'Pearl Jam', sales_region: 'United States', make_track: true, plan_code: 'jamtrack-pearljam-evenflow') + + # make sure plans are there + @recurlyClient.create_jam_track_plan(@jamtrack_acdc_backinblack) unless @recurlyClient.find_jam_track_plan(@jamtrack_acdc_backinblack) + @recurlyClient.create_jam_track_plan(@jamtrack_pearljam_evenflow) unless @recurlyClient.find_jam_track_plan(@jamtrack_pearljam_evenflow) + end + + + after(:each) do + @created_accounts.each do |user| + if user.recurly_code + begin + @account = Recurly::Account.find(user.recurly_code) + if @account.present? + @account.destroy + end + rescue + end + end + end + end + + describe "AC/DC Back in Black" do + + it "logged out" do + visit "/landing/jamtracks/band/acdc-backinblack" + + find('h1', text: "We Have 1 #{@jamtrack_acdc_backinblack.original_artist} JamTrack, Check It Out!") + jamtrack_acdc_backinblack.jam_track_tracks.each do |track| + if track.master? + find('.jam-track-preview-holder[data-id="' + track.id + '"] img.instrument-icon[data-instrument-id="other"]') + find('.jam-track-preview-holder[data-id="' + track.id + '"] .instrument-name', text:'Master Mix') + else + find('.jam-track-preview-holder[data-id="' + track.id + '"] img.instrument-icon[data-instrument-id="' + track.instrument.id + '"]') + find('.jam-track-preview-holder[data-id="' + track.id + '"] .instrument-name', text:track.instrument.description) + end + end + find('a.white-bordered-button')['href'].should eq("/client?artist=#{jamtrack_acdc_backinblack.original_artist}#/jamtrack") + end + + it "logged in" do + fast_signin(user, "/landing/jamtracks/band/acdc-backinblack") + + find('h1', text: "We Have 1 #{@jamtrack_acdc_backinblack.original_artist} JamTrack, Check It Out!") + jamtrack_acdc_backinblack.jam_track_tracks.each do |track| + if track.master? + find('.jam-track-preview-holder[data-id="' + track.id + '"] img.instrument-icon[data-instrument-id="other"]') + find('.jam-track-preview-holder[data-id="' + track.id + '"] .instrument-name', text:'Master Mix') + else + find('.jam-track-preview-holder[data-id="' + track.id + '"] img.instrument-icon[data-instrument-id="' + track.instrument.id + '"]') + find('.jam-track-preview-holder[data-id="' + track.id + '"] .instrument-name', text:track.instrument.description) + end + end + find('a.white-bordered-button')['href'].should eq("/client?artist=#{jamtrack_acdc_backinblack.original_artist}#/jamtrack") + end + end +end diff --git a/web/spec/features/individual_jamtrack_spec.rb b/web/spec/features/individual_jamtrack_spec.rb index 938591040..490fe9757 100644 --- a/web/spec/features/individual_jamtrack_spec.rb +++ b/web/spec/features/individual_jamtrack_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe "Home Screen", :js => true, :type => :feature, :capybara_feature => true do +describe "Individual JamTrack", :js => true, :type => :feature, :capybara_feature => true do subject { page }