diff --git a/.gitignore b/.gitignore index 8927de757..9a18ea4cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea *~ *.swp -HTML \ No newline at end of file +HTML +.DS_Store diff --git a/db/manifest b/db/manifest index 496079ce6..7825af66d 100755 --- a/db/manifest +++ b/db/manifest @@ -91,4 +91,6 @@ music_session_constraints.sql mixes_drop_manifest_add_retry.sql music_sessions_unlogged.sql integrate_icecast_into_sessions.sql +ms_recording_anonymous_likes.sql +ms_user_history_add_instruments.sql icecast_config_changed.sql \ No newline at end of file diff --git a/db/up/ms_recording_anonymous_likes.sql b/db/up/ms_recording_anonymous_likes.sql new file mode 100644 index 000000000..ad9e765b6 --- /dev/null +++ b/db/up/ms_recording_anonymous_likes.sql @@ -0,0 +1,23 @@ +alter table music_sessions_comments +add column ip_address inet; + +alter table music_sessions_likers +add column ip_address inet; + +alter table music_sessions_likers +alter column liker_id drop not null; + +alter table recordings_comments +add column ip_address inet; + +alter table recordings_likers +add column ip_address inet; + +alter table recordings_likers +alter column liker_id drop not null; + +alter table recordings_plays +add column ip_address inet; + +alter table recordings_plays +alter column player_id drop not null; diff --git a/db/up/ms_user_history_add_instruments.sql b/db/up/ms_user_history_add_instruments.sql new file mode 100644 index 000000000..67737b75a --- /dev/null +++ b/db/up/ms_user_history_add_instruments.sql @@ -0,0 +1 @@ +alter table music_sessions_user_history add column instruments varchar(255); \ No newline at end of file diff --git a/db/up/music_session_constraints.sql b/db/up/music_session_constraints.sql index 72f2bccd4..f070bc571 100644 --- a/db/up/music_session_constraints.sql +++ b/db/up/music_session_constraints.sql @@ -6,4 +6,4 @@ ON UPDATE NO ACTION ON DELETE CASCADE; alter table music_sessions_likers drop constraint music_sessions_likers_music_session_id_fkey; alter table music_sessions_likers add constraint ms_likers_ms_history_fkey foreign key (music_session_id) references music_sessions_history(music_session_id) match simple -ON UPDATE NO ACTION ON DELETE CASCADE; +ON UPDATE NO ACTION ON DELETE CASCADE; \ No newline at end of file diff --git a/pb/src/client_container.proto b/pb/src/client_container.proto index c6669a824..ee046738a 100644 --- a/pb/src/client_container.proto +++ b/pb/src/client_container.proto @@ -109,7 +109,6 @@ message ClientMessage { optional SessionJoin session_join = 190; optional SessionDepart session_depart = 195; optional MusicianSessionJoin musician_session_join = 196; - optional BandSessionJoin band_session_join = 197; // recording notifications optional MusicianRecordingSaved musician_recording_saved = 200; diff --git a/ruby/lib/jam_ruby/connection_manager.rb b/ruby/lib/jam_ruby/connection_manager.rb index 5a13351c5..d747d7d9e 100644 --- a/ruby/lib/jam_ruby/connection_manager.rb +++ b/ruby/lib/jam_ruby/connection_manager.rb @@ -311,7 +311,7 @@ SQL else blk.call(db_conn, connection) unless blk.nil? user.update_progression_field(:first_music_session_at) - MusicSessionUserHistory.save(music_session_id, user_id, client_id) + MusicSessionUserHistory.save(music_session_id, user_id, client_id, tracks) end end diff --git a/ruby/lib/jam_ruby/models/band.rb b/ruby/lib/jam_ruby/models/band.rb index a0a2b4b35..1ae5b26a0 100644 --- a/ruby/lib/jam_ruby/models/band.rb +++ b/ruby/lib/jam_ruby/models/band.rb @@ -62,6 +62,13 @@ module JamRuby return self.music_sessions.size end + def recent_history + recordings = ClaimedRecording.joins(:recordings).where(:recordings => {:band_id => "#{self.id}"}).limit(10) + msh = MusicSessionHistory.where(:band_id => self.id).limit(10) + recordings.concat(msh) + recordings.sort! {|a,b| b.created_at <=> a.created_at}.first(5) + end + def location loc = self.city.blank? ? '' : self.city loc = loc.blank? ? self.state : "#{loc}, #{self.state}" unless self.state.blank? diff --git a/ruby/lib/jam_ruby/models/music_session_comment.rb b/ruby/lib/jam_ruby/models/music_session_comment.rb index cda5589bd..71fa8ae9a 100644 --- a/ruby/lib/jam_ruby/models/music_session_comment.rb +++ b/ruby/lib/jam_ruby/models/music_session_comment.rb @@ -5,6 +5,8 @@ module JamRuby self.primary_key = 'id' + default_scope order('created_at DESC') + belongs_to :music_session, :class_name => "JamRuby::MusicSessionHistory", :foreign_key => "music_session_id" belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "creator_id" diff --git a/ruby/lib/jam_ruby/models/music_session_history.rb b/ruby/lib/jam_ruby/models/music_session_history.rb index 1a6fd8418..7b552c08b 100644 --- a/ruby/lib/jam_ruby/models/music_session_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_history.rb @@ -15,10 +15,11 @@ module JamRuby :foreign_key => :band_id, :inverse_of => :music_session_history) + has_many :music_session_user_history, :class_name => "JamRuby::MusicSessionUserHistory", :foreign_key => "music_session_id" has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id" has_many :likes, :class_name => "JamRuby::MusicSessionLiker", :foreign_key => "music_session_id" - GENRE_SEPARATOR = '|' + SEPARATOR = '|' def comment_count self.comments.size @@ -28,6 +29,21 @@ module JamRuby self.likes.size end + def tracks + tracks = [] + self.music_session_user_history.each do |msuh| + user = User.find(msuh.user_id) + instruments = msuh.instruments.split(SEPARATOR) + instruments.each do |instrument| + t = Track.new + t.user = user + t.instrument_id = instrument + tracks << t + end + end + tracks + end + def self.index(current_user, user_id, band_id = nil, genre = nil) hide_private = false if current_user.id != user_id @@ -74,7 +90,7 @@ module JamRuby session_history.description = music_session.description unless music_session.description.nil? session_history.user_id = music_session.creator.id session_history.band_id = music_session.band.id unless music_session.band.nil? - session_history.genres = music_session.genres.map { |g| g.id }.join GENRE_SEPARATOR + session_history.genres = music_session.genres.map { |g| g.id }.join SEPARATOR session_history.save! end diff --git a/ruby/lib/jam_ruby/models/music_session_user_history.rb b/ruby/lib/jam_ruby/models/music_session_user_history.rb index 4e7a294b9..5939f8bff 100644 --- a/ruby/lib/jam_ruby/models/music_session_user_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_user_history.rb @@ -12,6 +12,10 @@ module JamRuby :foreign_key => "user_id", :inverse_of => :music_session_user_histories) + belongs_to(:music_session_history, + :class_name => "MusicSessionHistory", + :foreign_key => "music_session_id") + validates_inclusion_of :rating, :in => 0..2, :allow_nil => true after_save :track_user_progression @@ -23,7 +27,7 @@ module JamRuby @perfdata ||= JamRuby::MusicSessionPerfData.find_by_client_id(self.client_id) end - def self.save(music_session_id, user_id, client_id) + def self.save(music_session_id, user_id, client_id, tracks) return true if 0 < self.where(:music_session_id => music_session_id, :user_id => user_id, :client_id => client_id).count @@ -31,6 +35,7 @@ module JamRuby session_user_history.music_session_id = music_session_id session_user_history.user_id = user_id session_user_history.client_id = client_id + session_user_history.instruments = tracks.map {|t| t[:instrument_id]}.join("|") session_user_history.save end diff --git a/ruby/lib/jam_ruby/models/recording_comment.rb b/ruby/lib/jam_ruby/models/recording_comment.rb index 8b7e5ae62..5747da52f 100644 --- a/ruby/lib/jam_ruby/models/recording_comment.rb +++ b/ruby/lib/jam_ruby/models/recording_comment.rb @@ -5,6 +5,8 @@ module JamRuby self.primary_key = 'id' + default_scope order('created_at DESC') + belongs_to :recording, :class_name => "JamRuby::Recording", :foreign_key => "recording_id" belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "creator_id" diff --git a/ruby/lib/jam_ruby/models/track.rb b/ruby/lib/jam_ruby/models/track.rb index 76b428b09..21f45c40f 100644 --- a/ruby/lib/jam_ruby/models/track.rb +++ b/ruby/lib/jam_ruby/models/track.rb @@ -14,6 +14,10 @@ module JamRuby validates :sound, :inclusion => {:in => SOUND} + def user + self.connection.user + end + def self.index(current_user, music_session_id) query = Track .joins( @@ -47,6 +51,10 @@ module JamRuby Track.transaction do connection = Connection.find_by_client_id!(clientId) + # each time tracks are synced we have to update the entry in music_sessions_user_history + msh = MusicSessionUserHistory.find_by_client_id!(clientId) + instruments = [] + if tracks.length == 0 connection.tracks.delete_all else @@ -62,9 +70,11 @@ module JamRuby to_delete.delete(connection_track) to_add.delete(track) # don't update connection_id or client_id; it's unknown what would happen if these changed mid-session - connection_track.instrument = Instrument.find(track[:instrument_id]) + connection_track.instrument_id = track[:instrument_id] connection_track.sound = track[:sound] connection_track.client_track_id = track[:client_track_id] + + instruments << track[:instrument_id] if connection_track.save result.push(connection_track) next @@ -76,10 +86,15 @@ module JamRuby end end + msh.instruments = instruments.join("|") + if !msh.save + raise ActiveRecord::Rollback + end + to_add.each do |track| connection_track = Track.new connection_track.connection = connection - connection_track.instrument = Instrument.find(track[:instrument_id]) + connection_track.instrument_id = track[:instrument_id] connection_track.sound = track[:sound] connection_track.client_track_id = track[:client_track_id] if connection_track.save @@ -90,7 +105,7 @@ module JamRuby end end - to_delete.each do| delete_me | + to_delete.each do |delete_me| delete_me.delete end end @@ -101,7 +116,7 @@ module JamRuby def self.save(id, connection_id, instrument_id, sound, client_track_id) if id.nil? - track = Track.new() + track = Track.new track.connection_id = connection_id else track = Track.find(id) diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index f1b703f10..17c5cfc47 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -288,6 +288,13 @@ module JamRuby def session_count return self.music_sessions.size end + + def recent_history + recordings = ClaimedRecording.joins(:recording).where(:recordings => {:owner_id => "#{self.id}"}).limit(10) + msh = MusicSessionHistory.where(:user_id => self.id).limit(10) + recordings.concat(msh) + recordings.sort! {|a,b| b.created_at <=> a.created_at}.first(5) + end def confirm_email! self.email_confirmed = true diff --git a/ruby/lib/jam_ruby/resque/icecast_config_writer.rb b/ruby/lib/jam_ruby/resque/icecast_config_writer.rb index 12868ac17..bbecffa29 100644 --- a/ruby/lib/jam_ruby/resque/icecast_config_writer.rb +++ b/ruby/lib/jam_ruby/resque/icecast_config_writer.rb @@ -53,7 +53,7 @@ module JamRuby def validate raise "icecast_server_id not spceified" unless icecast_server_id - raise "queue routing mismatch error. requested icecast_server_id: #{icecast_server_id}, configured icceast_server_id: #{APP_CONFIG.icecast_server_id}" unless icecast_server_id == APP_CONFIG.icecast_server_id + raise "queue routing mismatch error. requested icecast_server_id: #{icecast_server_id}, configured icecast_server_id: #{APP_CONFIG.icecast_server_id}" unless icecast_server_id == APP_CONFIG.icecast_server_id end def execute(cmd) diff --git a/ruby/spec/jam_ruby/resque/icecast_config_worker_spec.rb b/ruby/spec/jam_ruby/resque/icecast_config_worker_spec.rb index 3c5de1e7d..8fc5ffcec 100644 --- a/ruby/spec/jam_ruby/resque/icecast_config_worker_spec.rb +++ b/ruby/spec/jam_ruby/resque/icecast_config_worker_spec.rb @@ -14,7 +14,7 @@ describe IcecastConfigWriter do it "no files specified" do worker.icecast_server_id = 'something' - expect { worker.validate }.to raise_error("queue routing mismatch error") + expect { worker.validate }.to raise_error("queue routing mismatch error. requested icecast_server_id: #{worker.icecast_server_id}, configured icecast_server_id: #{APP_CONFIG.icecast_server_id}") end it "succeeds" do diff --git a/web/app/assets/images/content/avatar_band1.jpg b/web/app/assets/images/content/avatar_band1.jpg new file mode 100644 index 000000000..340ae0955 Binary files /dev/null and b/web/app/assets/images/content/avatar_band1.jpg differ diff --git a/web/app/assets/images/content/avatar_band2.jpg b/web/app/assets/images/content/avatar_band2.jpg new file mode 100644 index 000000000..a3f1e82b2 Binary files /dev/null and b/web/app/assets/images/content/avatar_band2.jpg differ diff --git a/web/app/assets/images/content/avatar_band3.jpg b/web/app/assets/images/content/avatar_band3.jpg new file mode 100644 index 000000000..5b950bd8c Binary files /dev/null and b/web/app/assets/images/content/avatar_band3.jpg differ diff --git a/web/app/assets/images/content/avatar_band4.jpg b/web/app/assets/images/content/avatar_band4.jpg new file mode 100644 index 000000000..125009752 Binary files /dev/null and b/web/app/assets/images/content/avatar_band4.jpg differ diff --git a/web/app/assets/images/content/avatar_band5.jpg b/web/app/assets/images/content/avatar_band5.jpg new file mode 100644 index 000000000..dc22689bb Binary files /dev/null and b/web/app/assets/images/content/avatar_band5.jpg differ diff --git a/web/app/assets/images/content/icon_arrow.png b/web/app/assets/images/content/icon_arrow.png new file mode 100644 index 000000000..e8685069d Binary files /dev/null and b/web/app/assets/images/content/icon_arrow.png differ diff --git a/web/app/assets/images/content/icon_comment.png b/web/app/assets/images/content/icon_comment.png new file mode 100644 index 000000000..57ceb1035 Binary files /dev/null and b/web/app/assets/images/content/icon_comment.png differ diff --git a/web/app/assets/images/content/icon_instrument_acoustic24.png b/web/app/assets/images/content/icon_instrument_acoustic_guitar24.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_acoustic24.png rename to web/app/assets/images/content/icon_instrument_acoustic_guitar24.png diff --git a/web/app/assets/images/content/icon_instrument_acoustic45.png b/web/app/assets/images/content/icon_instrument_acoustic_guitar45.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_acoustic45.png rename to web/app/assets/images/content/icon_instrument_acoustic_guitar45.png diff --git a/web/app/assets/images/content/icon_instrument_bass24.png b/web/app/assets/images/content/icon_instrument_bass_guitar24.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_bass24.png rename to web/app/assets/images/content/icon_instrument_bass_guitar24.png diff --git a/web/app/assets/images/content/icon_instrument_bass45.png b/web/app/assets/images/content/icon_instrument_bass_guitar45.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_bass45.png rename to web/app/assets/images/content/icon_instrument_bass_guitar45.png diff --git a/web/app/assets/images/content/icon_instrument_guitar24.png b/web/app/assets/images/content/icon_instrument_electric_guitar24.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_guitar24.png rename to web/app/assets/images/content/icon_instrument_electric_guitar24.png diff --git a/web/app/assets/images/content/icon_instrument_guitar45.png b/web/app/assets/images/content/icon_instrument_electric_guitar45.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_guitar45.png rename to web/app/assets/images/content/icon_instrument_electric_guitar45.png diff --git a/web/app/assets/images/content/icon_instrument_frenchhorn24.png b/web/app/assets/images/content/icon_instrument_french_horn24.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_frenchhorn24.png rename to web/app/assets/images/content/icon_instrument_french_horn24.png diff --git a/web/app/assets/images/content/icon_instrument_frenchhorn45.png b/web/app/assets/images/content/icon_instrument_french_horn45.png similarity index 100% rename from web/app/assets/images/content/icon_instrument_frenchhorn45.png rename to web/app/assets/images/content/icon_instrument_french_horn45.png diff --git a/web/app/assets/images/content/icon_like.png b/web/app/assets/images/content/icon_like.png new file mode 100644 index 000000000..9ec7ebb66 Binary files /dev/null and b/web/app/assets/images/content/icon_like.png differ diff --git a/web/app/assets/images/shared/icon_accordion_256.png b/web/app/assets/images/shared/icon_accordion_256.png new file mode 100644 index 000000000..8b3748449 Binary files /dev/null and b/web/app/assets/images/shared/icon_accordion_256.png differ diff --git a/web/app/assets/images/shared/icon_acoustic_256.png b/web/app/assets/images/shared/icon_acoustic_256.png new file mode 100644 index 000000000..661ce97ef Binary files /dev/null and b/web/app/assets/images/shared/icon_acoustic_256.png differ diff --git a/web/app/assets/images/shared/icon_banjo_256.png b/web/app/assets/images/shared/icon_banjo_256.png new file mode 100644 index 000000000..e04fc8e38 Binary files /dev/null and b/web/app/assets/images/shared/icon_banjo_256.png differ diff --git a/web/app/assets/images/shared/icon_bass_256.png b/web/app/assets/images/shared/icon_bass_256.png new file mode 100644 index 000000000..756018463 Binary files /dev/null and b/web/app/assets/images/shared/icon_bass_256.png differ diff --git a/web/app/assets/images/shared/icon_cello_256.png b/web/app/assets/images/shared/icon_cello_256.png new file mode 100644 index 000000000..c5373a215 Binary files /dev/null and b/web/app/assets/images/shared/icon_cello_256.png differ diff --git a/web/app/assets/images/shared/icon_clarinet_256.png b/web/app/assets/images/shared/icon_clarinet_256.png new file mode 100644 index 000000000..195ae5654 Binary files /dev/null and b/web/app/assets/images/shared/icon_clarinet_256.png differ diff --git a/web/app/assets/images/shared/icon_computer_256.png b/web/app/assets/images/shared/icon_computer_256.png new file mode 100644 index 000000000..874f12d3f Binary files /dev/null and b/web/app/assets/images/shared/icon_computer_256.png differ diff --git a/web/app/assets/images/shared/icon_drums_256.png b/web/app/assets/images/shared/icon_drums_256.png new file mode 100644 index 000000000..4bd3e1c8e Binary files /dev/null and b/web/app/assets/images/shared/icon_drums_256.png differ diff --git a/web/app/assets/images/shared/icon_euphonium_256.png b/web/app/assets/images/shared/icon_euphonium_256.png new file mode 100644 index 000000000..59f790c05 Binary files /dev/null and b/web/app/assets/images/shared/icon_euphonium_256.png differ diff --git a/web/app/assets/images/shared/icon_flute_256.png b/web/app/assets/images/shared/icon_flute_256.png new file mode 100644 index 000000000..5da05ed9b Binary files /dev/null and b/web/app/assets/images/shared/icon_flute_256.png differ diff --git a/web/app/assets/images/shared/icon_frenchhorn_256.png b/web/app/assets/images/shared/icon_frenchhorn_256.png new file mode 100644 index 000000000..e0b077e75 Binary files /dev/null and b/web/app/assets/images/shared/icon_frenchhorn_256.png differ diff --git a/web/app/assets/images/shared/icon_guitar_256.png b/web/app/assets/images/shared/icon_guitar_256.png new file mode 100644 index 000000000..3ea207b74 Binary files /dev/null and b/web/app/assets/images/shared/icon_guitar_256.png differ diff --git a/web/app/assets/images/shared/icon_harmonica_256.png b/web/app/assets/images/shared/icon_harmonica_256.png new file mode 100644 index 000000000..abd48fa42 Binary files /dev/null and b/web/app/assets/images/shared/icon_harmonica_256.png differ diff --git a/web/app/assets/images/shared/icon_keyboard_256.png b/web/app/assets/images/shared/icon_keyboard_256.png new file mode 100644 index 000000000..b2f63670f Binary files /dev/null and b/web/app/assets/images/shared/icon_keyboard_256.png differ diff --git a/web/app/assets/images/shared/icon_mandolin_256.png b/web/app/assets/images/shared/icon_mandolin_256.png new file mode 100644 index 000000000..e2fac153d Binary files /dev/null and b/web/app/assets/images/shared/icon_mandolin_256.png differ diff --git a/web/app/assets/images/shared/icon_oboe_256.png b/web/app/assets/images/shared/icon_oboe_256.png new file mode 100644 index 000000000..4b198febc Binary files /dev/null and b/web/app/assets/images/shared/icon_oboe_256.png differ diff --git a/web/app/assets/images/shared/icon_other_256.png b/web/app/assets/images/shared/icon_other_256.png new file mode 100644 index 000000000..e5163cdc8 Binary files /dev/null and b/web/app/assets/images/shared/icon_other_256.png differ diff --git a/web/app/assets/images/shared/icon_saxophone_256.png b/web/app/assets/images/shared/icon_saxophone_256.png new file mode 100644 index 000000000..2503c212a Binary files /dev/null and b/web/app/assets/images/shared/icon_saxophone_256.png differ diff --git a/web/app/assets/images/shared/icon_trombone_256.png b/web/app/assets/images/shared/icon_trombone_256.png new file mode 100644 index 000000000..b143f8d9d Binary files /dev/null and b/web/app/assets/images/shared/icon_trombone_256.png differ diff --git a/web/app/assets/images/shared/icon_trumpet_256.png b/web/app/assets/images/shared/icon_trumpet_256.png new file mode 100644 index 000000000..5c90af5cc Binary files /dev/null and b/web/app/assets/images/shared/icon_trumpet_256.png differ diff --git a/web/app/assets/images/shared/icon_tuba_256.png b/web/app/assets/images/shared/icon_tuba_256.png new file mode 100644 index 000000000..551ea8e60 Binary files /dev/null and b/web/app/assets/images/shared/icon_tuba_256.png differ diff --git a/web/app/assets/images/shared/icon_ukelele_256.png b/web/app/assets/images/shared/icon_ukelele_256.png new file mode 100644 index 000000000..3c084ebb0 Binary files /dev/null and b/web/app/assets/images/shared/icon_ukelele_256.png differ diff --git a/web/app/assets/images/shared/icon_viola_256.png b/web/app/assets/images/shared/icon_viola_256.png new file mode 100644 index 000000000..9f2f94969 Binary files /dev/null and b/web/app/assets/images/shared/icon_viola_256.png differ diff --git a/web/app/assets/images/shared/icon_violin_256.png b/web/app/assets/images/shared/icon_violin_256.png new file mode 100644 index 000000000..5c64554a8 Binary files /dev/null and b/web/app/assets/images/shared/icon_violin_256.png differ diff --git a/web/app/assets/images/shared/icon_vocals_256.png b/web/app/assets/images/shared/icon_vocals_256.png new file mode 100644 index 000000000..89cd3e558 Binary files /dev/null and b/web/app/assets/images/shared/icon_vocals_256.png differ diff --git a/web/app/assets/images/shared/jk_logo_small.png b/web/app/assets/images/shared/jk_logo_small.png new file mode 100644 index 000000000..5951793c8 Binary files /dev/null and b/web/app/assets/images/shared/jk_logo_small.png differ diff --git a/web/app/assets/images/shared/jk_logo_small_fb.png b/web/app/assets/images/shared/jk_logo_small_fb.png new file mode 100644 index 000000000..6049599fe Binary files /dev/null and b/web/app/assets/images/shared/jk_logo_small_fb.png differ diff --git a/web/app/assets/images/shared/pause_button.png b/web/app/assets/images/shared/pause_button.png new file mode 100644 index 000000000..112881f0b Binary files /dev/null and b/web/app/assets/images/shared/pause_button.png differ diff --git a/web/app/assets/images/shared/play_button.png b/web/app/assets/images/shared/play_button.png new file mode 100644 index 000000000..ea4b3d1d1 Binary files /dev/null and b/web/app/assets/images/shared/play_button.png differ diff --git a/web/app/assets/javascripts/findMusician.js b/web/app/assets/javascripts/findMusician.js index 52a44c077..3599826ed 100644 --- a/web/app/assets/javascripts/findMusician.js +++ b/web/app/assets/javascripts/findMusician.js @@ -98,7 +98,7 @@ if (mm['instruments'][jj].instrument_id in instrument_logo_map) { instr = instrument_logo_map[mm['instruments'][jj].instrument_id]; } - instr_logos += ' '; + instr_logos += ''; } follows = ''; followVals = {}; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index e017d1de6..d85a15b30 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1319,6 +1319,7 @@ configureTrackDialog.showVoiceChatPanel(true); configureTrackDialog.showMusicAudioPanel(true); }); + $('#close-playback-recording').on('click', closeRecording); $(playbackControls) .on('pause', onPause) diff --git a/web/app/assets/javascripts/shareDialog.js b/web/app/assets/javascripts/shareDialog.js new file mode 100644 index 000000000..ddf0640ce --- /dev/null +++ b/web/app/assets/javascripts/shareDialog.js @@ -0,0 +1,102 @@ +(function(context,$) { + + "use strict"; + context.JK = context.JK || {}; + context.JK.ShareDialog = function(app) { + var logger = context.JK.logger; + var rest = context.JK.Rest(); + + function registerEvents(onOff) { + + } + + /*function showEmailDialog() { + $('#invitation-dialog').show(); + $('#invitation-textarea-container').show(); + $('#invitation-checkbox-container').hide(); + $('#btn-send-invitation').show(); + $('#btn-next-invitation').hide(); + clearTextFields(); + app.layout.showDialog('inviteUsers') + } + + function showGoogleDialog() { + $('#invitation-dialog').show(); + $('#invitation-textarea-container').hide(); + $('#invitation-checkbox-container').show(); + $('#btn-send-invitation').hide(); + $('#btn-next-invitation').show(); + clearTextFields(); + + app.layout.showDialog('inviteUsers') + + $('#invitation-checkboxes').html('
Loading your contacts...
'); + window._oauth_callback = function() { + window._oauth_win.close(); + window._oauth_win = null; + window._oauth_callback = null; + $.ajax({ + type: "GET", + url: "/gmail_contacts", + success: function(response) { + $('#invitation-checkboxes').html(''); + for (var i in response) { + $('#invitation-checkboxes').append(""); + } + + $('.invitation-checkbox').change(function() { + var checkedBoxes = $('.invitation-checkbox:checkbox:checked'); + var emails = ''; + for (var i = 0; i < checkedBoxes.length; i++) { + emails += $(checkedBoxes[i]).data('email') + ', '; + } + emails = emails.replace(/, $/, ''); + // track how many of these came from google + $('#txt-emails').val(emails).data('google_invite_count', checkedBoxes.length); + }); + }, + error: function() { + $('#invitation-checkboxes').html("Load failed!"); + } + }); + + }; + window._oauth_win = window.open("/auth/google_login", "_blank", "height=500,width=500,menubar=no,resizable=no,status=no"); + } + + function showFacebookDialog() { + window._oauth_callback = function() { + window._oauth_win.close(); + window._oauth_win = null; + window._oauth_callback = null; + }; + window._oauth_win = window.open("/auth/facebook_login", "_blank", "height=500,width=500,menubar=no,resizable=no,status=no"); + }*/ + + function clearTextFields() { + + } + + function beforeShow() { + registerEvents(true); + } + + function afterHide() { + registerEvents(false); + } + + function initialize(){ + var dialogBindings = { + 'beforeShow' : beforeShow, + 'afterHide': afterHide + }; + + app.bindDialog('shareSessionRecording', dialogBindings); + }; + + + this.initialize = initialize; + } + + return this; +})(window,jQuery); \ No newline at end of file diff --git a/web/app/assets/javascripts/user_dropdown.js b/web/app/assets/javascripts/user_dropdown.js index 71d700f94..b003f2d76 100644 --- a/web/app/assets/javascripts/user_dropdown.js +++ b/web/app/assets/javascripts/user_dropdown.js @@ -71,6 +71,7 @@ // initially show avatar function showAvatar() { var photoUrl = context.JK.resolveAvatarUrl(userMe.photo_url); + logger.debug("photoUrl=" + photoUrl); $('#header-avatar').attr('src', photoUrl); } diff --git a/web/app/assets/javascripts/utils.js b/web/app/assets/javascripts/utils.js index 030e94dfb..1fe7623c8 100644 --- a/web/app/assets/javascripts/utils.js +++ b/web/app/assets/javascripts/utils.js @@ -42,18 +42,18 @@ // available, and allowing the browser to resize offers better quality. var icon_map_base = { "accordion":"accordion", - "acoustic guitar":"acoustic", + "acoustic guitar":"acoustic_guitar", "banjo":"banjo", - "bass guitar":"bass", + "bass guitar":"bass_guitar", "cello":"cello", "clarinet":"clarinet", "computer":"computer", "default":"default", "drums":"drums", - "electric guitar":"guitar", + "electric guitar":"electric_guitar", "euphonium":"euphonium", "flute":"flute", - "french horn":"frenchhorn", + "french horn":"french_horn", "harmonica":"harmonica", "keyboard":"keyboard", "mandolin":"mandolin", diff --git a/web/app/assets/javascripts/web/recordings.js b/web/app/assets/javascripts/web/recordings.js new file mode 100644 index 000000000..2ab8ba2bf --- /dev/null +++ b/web/app/assets/javascripts/web/recordings.js @@ -0,0 +1,10 @@ +$(function() { + + function like() { + + } + + // search click handler + $('#btnlike').click(like); + +}); \ No newline at end of file diff --git a/web/app/assets/javascripts/web/sessions.js b/web/app/assets/javascripts/web/sessions.js new file mode 100644 index 000000000..2ab8ba2bf --- /dev/null +++ b/web/app/assets/javascripts/web/sessions.js @@ -0,0 +1,10 @@ +$(function() { + + function like() { + + } + + // search click handler + $('#btnlike').click(like); + +}); \ No newline at end of file diff --git a/web/app/assets/javascripts/web/web.js b/web/app/assets/javascripts/web/web.js index d5407b2fe..0cde1c7d7 100644 --- a/web/app/assets/javascripts/web/web.js +++ b/web/app/assets/javascripts/web/web.js @@ -6,6 +6,7 @@ //= require AAC_underscore //= require globals //= require invitationDialog +//= require shareDialog //= require layout //= require user_dropdown //= require jamkazam @@ -15,4 +16,6 @@ //= require landing/init //= require landing/signup //= require web/downloads -//= require web/congratulations \ No newline at end of file +//= require web/congratulations +//= require web/sessions +//= require web/recordings diff --git a/web/app/assets/stylesheets/client/client.css b/web/app/assets/stylesheets/client/client.css index a852d46bf..57f1af430 100644 --- a/web/app/assets/stylesheets/client/client.css +++ b/web/app/assets/stylesheets/client/client.css @@ -32,6 +32,7 @@ *= require ./search *= require ./ftue *= require ./invitationDialog + *= require ./shareDialog *= require ./recordingFinishedDialog *= require ./localRecordingsDialog *= require ./createSession diff --git a/web/app/assets/stylesheets/client/musician.css.scss b/web/app/assets/stylesheets/client/musician.css.scss index b9e47e290..821b354cc 100644 --- a/web/app/assets/stylesheets/client/musician.css.scss +++ b/web/app/assets/stylesheets/client/musician.css.scss @@ -34,8 +34,30 @@ padding-top: 5px; padding-right: 5px; padding-left: 5px; -} - -.musician-following { - overflow: auto; + + #result_instruments { + font-weight: normal; + > img { + margin-right: 4px; + height:24px; + width:24px; + } + } + .result-name { + font-size: 12px; + font-weight: bold; + margin-bottom: 2px; + } + .stats { + margin-top: 4px; + img { + vertical-align: middle; + } + } + .lcol { + width: 148px; + } + table.musicians { + margin-top:12px; + } } diff --git a/web/app/assets/stylesheets/client/screen_common.css.scss b/web/app/assets/stylesheets/client/screen_common.css.scss index 98fd15a4b..0a986912d 100644 --- a/web/app/assets/stylesheets/client/screen_common.css.scss +++ b/web/app/assets/stylesheets/client/screen_common.css.scss @@ -169,10 +169,13 @@ a { display:inline-block; } -small { - font-size:11px; +small, .small { + font-size:11px; } +.bold { + font-weight:bold; +} .button-grey { margin:0px 8px 0px 8px; background-color:#666; @@ -207,6 +210,11 @@ small { text-decoration:none; } +.smallbutton { + font-size:10px; + padding:2px 8px; +} + .button-orange:hover { background-color:#f16750; color:#FFF; @@ -233,161 +241,99 @@ a img { .clearall { clear:both; } - -.left { - float:left; +.clearleft { + clear:left; } -.right { - float:right; -} +.f8 {font-size:8px !important} +.f9 {font-size:9px !important} +.f10 {font-size:10px !important} +.f11 {font-size:11px !important} +.f12 {font-size:12px !important} +.f13 {font-size:13px !important} +.f14 {font-size:14px !important} +.f15 {font-size:15px !important} +.f16 {font-size:16px !important} +.f17 {font-size:17px !important} +.f18 {font-size:18px !important} +.f19 {font-size:19px !important} +.f20 {font-size:20px !important} -.f8 { - font-size: 8px !important; -} +.m0 {margin: 0 !important;} -.f9 { - font-size: 9px !important; -} +.mr5 {margin-right:5px;} +.mr10 {margin-right:10px;} +.mr20 {margin-right:20px;} +.mr30 {margin-right:30px;} +.mr35 {margin-right:35px;} +.mr40 {margin-right:40px;} +.mr120 {margin-right:120px;} -.f10 { - font-size: 10px !important; -} +.ml5 {margin-left:5px;} +.ml10 {margin-left:10px;} +.ml20 {margin-left:20px;} +.ml25 {margin-left:25px;} +.ml30 {margin-left:30px;} +.ml35 {margin-left:35px;} +.ml45 {margin-left:45px;} -.f11 { - font-size: 11px !important; -} +.mt5 {margin-top:5px;} +.mt10 {margin-top:10px;} +.mt15 {margin-top:15px;} +.mt20 {margin-top:20px;} +.mt25 {margin-top:25px;} +.mt30 {margin-top:30px;} +.mt35 {margin-top:35px;} +.mt40 {margin-top:40px;} +.mt45 {margin-top:45px;} +.mt50 {margin-top:50px;} +.mt55 {margin-top:55px;} +.mt65 {margin-top:65px;} -.f12 { - font-size: 12px !important; -} +.mb5 {margin-bottom:5px;} +.mb15 {margin-bottom:15px;} -.f13 { - font-size: 13px !important; -} +.w0 {width:0% !important} +.w5 {width:5% !important} +.w10 {width:10% !important} +.w15 {width:15% !important} +.w20 {width:20% !important} +.w25 {width:25% !important} +.w30 {width:30% !important} +.w35 {width:35% !important} +.w40 {width:40% !important} +.w45 {width:45% !important} +.w50 {width:50% !important} +.w55 {width:55% !important} +.w60 {width:60% !important} +.w65 {width:65% !important} +.w70 {width:70% !important} +.w75 {width:75% !important} +.w80 {width:80% !important} +.w85 {width:85% !important} +.w90 {width:90% !important} +.w95 {width:95% !important} +.w100 {width:100% !important} -.f14 { - font-size: 14px !important; -} +.p5 {padding:5px !important} +.p10 {padding:10px !important} +.p15 {padding:15px !important} +.p20 {padding:20px !important} +.p25 {padding:25px !important} +.p30 {padding:30px !important} -.f15 { - font-size: 15px !important; -} +.border-right {border-right:solid 1px #999;} +.border-left {border-left:solid 1px #999;} +.border-bottom {border-bottom:solid 1px #999;} +.border-top {border-top:solid 1px #999;} -.m0 { - margin: 0 !important; -} +.whitespace {white-space:normal;} +.clearall {clear:both;} -.mr5 { - margin-right:5px; -} - -.mr10 { - margin-right:10px; -} - -.mr20 { - margin-right:20px; -} - -.mr30 { - margin-right:30px; -} - -.mr35 { - margin-right:35px; -} - -.mr40 { - margin-right:40px; -} - -.mr120 { - margin-right:120px; -} - -.ml5 { - margin-left:5px; -} - -.ml10 { - margin-left:10px; -} - -.ml20 { - margin-left:20px; -} - -.ml25 { - margin-left:25px; -} - -.ml30 { - margin-left:30px; -} - -.ml35 { - margin-left:35px; -} - -.ml45 { - margin-left:45px; -} - -.mt5 { - margin-top:5px; -} - -.mt10 { - margin-top:10px; -} - -.mt15 { - margin-top:15px; -} - -.mt20 { - margin-top:20px; -} - -.mt25 { - margin-top:25px; -} - -.mt30 { - margin-top:30px; -} - -.mt35 { - margin-top:35px; -} - -.mt40 { - margin-top:40px; -} - -.mt45 { - margin-top:45px; -} - -.mt50 { - margin-top:50px; -} - -.mt55 { - margin-top:55px; -} - -.mt65 { - margin-top:65px; -} - -.mb5 { - margin-bottom:5px; -} - -.mb15 { - margin-bottom:15px; +.error { + background-color:#300; + padding:5px; + border: solid 1px #900; } .op50 { @@ -443,20 +389,16 @@ a img { width:239px; } -.white { - color:#fff; -} - -.lightgrey { - color:#ccc; -} - -.grey { - color:#999; -} - -.darkgrey { - color:#333; -} +.white {color:#fff;} +.lightgrey {color:#ccc;} +.grey {color:#999;} +.darkgrey {color:#333;} +.orange {color:#ED3618 !important;} +.teal {color:#2b8897;} +.green-fill {background-color:#72a43b;} +.gold-fill {background-color:#cc9900;} +.red-fill {background-color:#660000;} +.orange-fill {background-color:#ed3618;} +.teal-fill {background-color:#0b6672;} /* End of Jeff's common.css file */ diff --git a/web/app/assets/stylesheets/client/shareDialog.css.scss b/web/app/assets/stylesheets/client/shareDialog.css.scss new file mode 100644 index 000000000..39f012938 --- /dev/null +++ b/web/app/assets/stylesheets/client/shareDialog.css.scss @@ -0,0 +1,185 @@ +body.widgets { + background:#fff; + padding:20px; +} + +.widget { + width:430px; + height:180px; + background:#353535; + border:solid 1px; + text-align:left; +} + +.widget.session { + border-color:#0b6672; +} + +.widget.recording { + border-color:#ed3618; +} + +.widget-header { + color:#fff; + font-size:17px; + padding:8px; +} + +.widget-content { + width:100%; + color:#ccc; + position:relative; +} + +.widget-avatar { + top:15px; + left:15px; + position:absolute; + padding:2px; + width:110px; + height:110px; + background-color:#ed3618; + -webkit-border-radius:57px; + -moz-border-radius:57px; + border-radius:57px; + margin-bottom:10px; +} + +.widget-avatar img { + width:110px; + height:110px; + -webkit-border-radius:55px; + -moz-border-radius:55px; + border-radius:55px; +} + +.widget-playbutton { + position:absolute; + top:55px; + left:55px; + width:35px; + height:31px; + background-image:url(../shared/play_button.png); + background-repeat:no-repeat; +} + +.widget-pausebutton { + position:absolute; + top:55px; + left:55px; + width:35px; + height:31px; + background-image:url(../shared/pause_button.png); + background-repeat:no-repeat; +} + +.widget-title { + font-size:18px; + position:absolute; + top:20px; + left:153px; + width:260px; + height:22px; + overflow:hidden; + white-space:nowrap; + text-overflow:ellipsis; +} + +.widget-description { + font-size:13px; + position:absolute; + top:15px; + left:153px; + width:260px; + height:32px; + overflow:hidden; + text-overflow:ellipsis; +} + +.widget-controls { + position:absolute; + top:25px; + left:153px; + width:270px; + height:32px; +} + +.widget-members { + position:absolute; + left:153px; + top:60px; + width:280px; + height:38px; + overflow:hidden; +} + +.widget-social { + position:absolute; + top:75px; + left:153px; + width:270px; + height:20px; + font-size:13px; +} + +.widget-branding { + position: absolute; + top: 110px; + right: 8px; + width: 270px; + height: 34px; + font-size: 13px; + text-align:right; +} + +.widget .recording-controls { + margin-top:0px; + height:22px; + padding:8px 5px; +} + +.widget .recording-playback { + width:65%; +} + +.widget .recording-position { + margin-left:-30px; + width:95%; +} + +.widget .recording-current { + top:8px; +} + +.widget a { + color:#ccc; + text-decoration:none; +} + +img.space { + margin-left:28px; +} + +.widget a:hover { + color:#fff; +} + +.widget-avatar-small { + float:left; + padding:1px; + width: 36px; + height:36px; + background-color:#ed3618; + -webkit-border-radius:18px; + -moz-border-radius:18px; + border-radius:18px; + margin-right:15px; +} + +.widget-avatar-small img { + width: 36px; + height: 36px; + -webkit-border-radius:18px; + -moz-border-radius:18px; + border-radius:18px; +} diff --git a/web/app/assets/stylesheets/client/user_dropdown.css.scss b/web/app/assets/stylesheets/client/user_dropdown.css.scss index 471883c4c..42e8081af 100644 --- a/web/app/assets/stylesheets/client/user_dropdown.css.scss +++ b/web/app/assets/stylesheets/client/user_dropdown.css.scss @@ -7,12 +7,18 @@ } #profile { - width:auto; - float:right; - height:64px; + float: right; + height: 54px; + margin-top: 30px; + text-align: right; + + ul { + margin-bottom:0; + } + .signin { - position:relative; - margin-top:40px; + text-decoration: underline; + cursor: auto; } } @@ -35,7 +41,7 @@ border-radius:26px; } -#user { +.user { margin:18px 0px 0px 10px; font-size:20px; font-weight:200; diff --git a/web/app/assets/stylesheets/web/main.css.scss b/web/app/assets/stylesheets/web/main.css.scss index fb3b8f142..49df23e0f 100644 --- a/web/app/assets/stylesheets/web/main.css.scss +++ b/web/app/assets/stylesheets/web/main.css.scss @@ -2,6 +2,10 @@ html { height:100%; } +p, div { + white-space: normal; +} + body.web { background-repeat: repeat-x; margin:0 !important; @@ -10,165 +14,259 @@ body.web { overflow: visible !important; width:auto !important; - #web-container { - padding:3% 0; + .logo-home { + width: 298px; + margin-top: 30px; + display: inline-block; + } + + .landing-tag { + display:inline-block; + margin-left:70px; + width:400px; + } + + .landing-tag h1 { + color:#ed3718; + font-size:26px; + font-weight:300; + } + + .landing-content { + background-color:black; + width:100%; + padding-bottom:15px; + min-height: 366px; + position:relative; + padding-bottom:30px; } div.wrapper { - white-space: nowrap; - - p, ul { - color:#999; - line-height:160%; - margin-bottom:20px; - width:90%; - white-space:normal; - font-size:16px; - } - - h2 { - font-weight:300; - } - - .content-wrapper { - border-bottom: medium none; - padding: 0; - } - - .black-bar{ - position:relative; - width:100%; - min-height: 366px; - background-color:black; - padding-top:20px; - } - - .black-bar-inner { - width:1100px; - margin: 0 auto; - - position:relative; - - // all custom CSS for the register page goes here - .register-page { - - .register-container { - padding:10px; - } - - input.register-musician { - - } - - .actions { - margin-top:20px; - - a.button-grey { - line-height:15px; // WHY is this not universal - } - } - - - .error { - padding: 5px 12px 5px 5px; - margin-left:-5px; - margin-right:-12px; - } - - input.register-fan { - margin-left:20px; - } - - input[type=text], input[type=password] { - margin-top:1px; - width:100%; - } - - select { - width:100%; - } - - - .right-side { - margin-left:25px; - } - - - .register-left { - - select { - width:104%; - } - - div.field { - margin-top:31px; - width:43%; - float:left; - } - } - - .register-right { - - margin-top:40px; - - table { - border-collapse:separate; - border-spacing:6px; - } - - label.instruments { - margin-bottom:2px; - } - - div.field { - margin-top:15px; - } - - a.tos { - text-decoration: underline; - } - - .ftue-instrumentlist { - width:100%; - } - } - } - } - - .after-black-bar { - position:relative; - background-color:#262626; - width:1100px; - margin:0 auto; - - .after-black-bar-inner { - background-color:#262626; - position:absolute; - left:0; - right:0; - } - } - } - - .header { width:1100px; margin:0 auto; - - .logo-home { - width: 298px; - margin-top: 30px; - display: inline-block; - float:left; - } + white-space:nowrap; + position:relative; } - #profile { + .landing-sidebar { + width:350px; + background:#353535; + border:solid 1px #ed3718; position:absolute; - top:-80px; - right:0; + top:30px; + right:0px; + padding:25px; + padding-top:0px; + line-height:130%; + } - ul { - margin-bottom:0; + .landing-sidebar h2 { + font-size:18px !important; + line-height:normal; + color:#fff; + } + + .landing-band { + float:left; + text-align:center; + width: 115px; + margin-right:25px; + font-size:17px; + color:#fff; + } + + .landing-avatar { + padding:2px; + width:110px; + height:110px; + background-color:#ed3618; + -webkit-border-radius:57px; + -moz-border-radius:57px; + border-radius:57px; + margin-bottom:10px; + } + + .landing-avatar img { + width:110px; + height:110px; + -webkit-border-radius:55px; + -moz-border-radius:55px; + border-radius:55px; + } + + .landing-details { + float:left; + width:515px; + font-size:14px; + font-weight:400; + color:#666; + } + + .landing-details a { + text-decoration:none; + color:#ccc; + } + + .landing-details a:hover { + color:#fff; + } + + .landing-content h2 { + font-size:24px; + color:#ccc; + font-weight:200; + } + + .landing-comments { + margin-left:140px; + width:515px; + } + + .landing-comments a { + text-decoration:none; + font-weight:bold; + color:#ED3618; + } + + .landing-comment-scroller { + height:470px; + overflow:auto; + } + + .landing .cta { + margin-top:25px; + } + + .avatar-small { + float:left; + padding:1px; + width:36px; + height:36px; + background-color:#ed3618; + margin:10px; + -webkit-border-radius:18px; + -moz-border-radius:18px; + border-radius:18px; + } + + .avatar-small img { + width: 36px; + height: 36px; + -webkit-border-radius:18px; + -moz-border-radius:18px; + border-radius:18px; + } + + .cta { + margin-top:40px; + text-align:center; + width:345px; + font-size:12px; + } + + white-space: nowrap; + + p, ul { + color:#999; + line-height:160%; + margin-bottom:20px; + width:90%; + white-space:normal; + font-size:16px; + } + + h2 { + font-size: 1.5em; + font-weight:300; + } + + .content-wrapper { + border-bottom: medium none; + padding: 0; + } + + + // all custom CSS for the register page goes here + .register-page { + + .register-container { + padding:10px; + } + + input.register-musician { + + } + + .actions { + margin-top:20px; + + a.button-grey { + line-height:15px; // WHY is this not universal + } + } + + .error { + padding: 5px 12px 5px 5px; + margin-left:-5px; + margin-right:-12px; + } + + input.register-fan { + margin-left:20px; + } + + input[type=text], input[type=password] { + margin-top:1px; + width:100%; + } + + select { + width:100%; + } + + + .right-side { + margin-left:25px; + } + + + .register-left { + + select { + width:104%; + } + + div.field { + margin-top:31px; + width:43%; + float:left; + } + } + + .register-right { + + margin-top:40px; + + table { + border-collapse:separate; + border-spacing:6px; + } + + label.instruments { + margin-bottom:2px; + } + + div.field { + margin-top:15px; + } + + a.tos { + text-decoration: underline; + } + + .ftue-instrumentlist { + width:100%; + } } } @@ -215,11 +313,6 @@ body.web { } } -#landing-container { - padding: 3% 0; - position:relative; - text-align: center; -} .signin-overlay { position:relative; diff --git a/web/app/assets/stylesheets/web/recordings.css.scss b/web/app/assets/stylesheets/web/recordings.css.scss new file mode 100644 index 000000000..45e591aa1 --- /dev/null +++ b/web/app/assets/stylesheets/web/recordings.css.scss @@ -0,0 +1,59 @@ +.feed-entry .recording-controls, .feed-entry .session-controls, .landing-details .recording-controls { + margin-top:0px; + margin-bottom:5px; + padding:8px 5px 8px 10px; + width:98%; + position:relative; + text-align:center; + background-color:#242323; +} + +.recording-position { + display:inline-block; + width:80%; + margin-left:-20px; + font-family:Arial, Helvetica, sans-serif; + font-size:11px; + height:18px; + vertical-align:top; +} + +.landing-details .recording-position { + width:100%; +} + +.recording-time { + display:inline-block; + height:16px; + vertical-align:top; + margin-top:4px; +} + +.landing-details .recording-current { + top:8px; +} + +.recording-playback { + display:inline-block; + background-image:url(../content/bkg_playcontrols.png); + background-repeat:repeat-x; + position:relative; + width:70%; + height:16px; + margin-top:2px; +} + +.recording-slider { + position:absolute; + left:25%; + top:0px; +} + +.recording-current { + font-family:Arial, Helvetica, sans-serif; + display:inline-block; + font-size:18px; + position:absolute; + top:3px; + right:4px; +} \ No newline at end of file diff --git a/web/app/assets/stylesheets/web/sessions.css.scss b/web/app/assets/stylesheets/web/sessions.css.scss new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/web/app/assets/stylesheets/web/sessions.css.scss @@ -0,0 +1,2 @@ + + diff --git a/web/app/assets/stylesheets/web/web.css b/web/app/assets/stylesheets/web/web.css index eee7082da..b8ae9ed79 100644 --- a/web/app/assets/stylesheets/web/web.css +++ b/web/app/assets/stylesheets/web/web.css @@ -7,6 +7,9 @@ *= require client/user_dropdown *= require client/dialog *= require client/invitationDialog +*= require client/shareDialog *= require web/main *= require web/footer +*= require web/recordings +#= require web/sessions */ \ No newline at end of file diff --git a/web/app/controllers/api_invitations_controller.rb b/web/app/controllers/api_invitations_controller.rb index ac487c8a9..58a3965e6 100644 --- a/web/app/controllers/api_invitations_controller.rb +++ b/web/app/controllers/api_invitations_controller.rb @@ -37,34 +37,26 @@ class ApiInvitationsController < ApiController sender = current_user join_request = JoinRequest.find(params[:join_request]) unless params[:join_request].nil? - @invitation = Invitation.limit(1) - .where(:receiver_id => params[:receiver], - :sender_id => current_user.id, - :music_session_id => params[:music_session]) - .first - if @invitation + @invitation = Invitation.new + @invitation.music_session = music_session + @invitation.sender = sender + @invitation.receiver = receiver + @invitation.join_request = join_request + @invitation.save + + unless @invitation.errors.any? + User.save_session_settings(current_user, music_session) + + # send notification + Notification.send_session_invitation(receiver, current_user, music_session.id) respond_with @invitation, :responder => ApiResponder, :location => api_invitation_detail_url(@invitation) + else - @invitation = Invitation.new - @invitation.music_session = music_session - @invitation.sender = sender - @invitation.receiver = receiver - @invitation.join_request = join_request - @invitation.save - - unless @invitation.errors.any? - User.save_session_settings(current_user, music_session) - - # send notification - Notification.send_session_invitation(receiver, current_user, music_session.id) - respond_with @invitation, :responder => ApiResponder, :location => api_invitation_detail_url(@invitation) - - else - # we have to do this because api_invitation_detail_url will fail with a bad @invitation - response.status = :unprocessable_entity - respond_with @invitation - end + # we have to do this because api_invitation_detail_url will fail with a bad @invitation + response.status = :unprocessable_entity + respond_with @invitation end + end def show diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index daf5f5fe9..ecfd62359 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -3,7 +3,7 @@ require 'aws-sdk' class ApiMusicSessionsController < ApiController # have to be signed in currently to see this screen - before_filter :api_signed_in_user + before_filter :api_signed_in_user, :except => [ :add_like ] before_filter :lookup_session, only: [:show, :update, :delete, :claimed_recording_start, :claimed_recording_stop] skip_before_filter :api_signed_in_user, only: [:perf_upload] @@ -257,6 +257,7 @@ class ApiMusicSessionsController < ApiController comment.music_session_id = params[:id] comment.creator_id = params[:user_id] comment.comment = params[:comment] + comment.ip_address = request.remote_ip comment.save if comment.errors.any? @@ -278,6 +279,7 @@ class ApiMusicSessionsController < ApiController liker = MusicSessionLiker.new liker.music_session_id = params[:id] liker.liker_id = params[:user_id] + liker.ip_address = request.remote_ip liker.save if liker.errors.any? diff --git a/web/app/controllers/api_recordings_controller.rb b/web/app/controllers/api_recordings_controller.rb index 3a8986fb2..ce06547c6 100644 --- a/web/app/controllers/api_recordings_controller.rb +++ b/web/app/controllers/api_recordings_controller.rb @@ -1,6 +1,6 @@ class ApiRecordingsController < ApiController - before_filter :api_signed_in_user + before_filter :api_signed_in_user, :except => [ :add_like, :add_play ] before_filter :look_up_recording, :only => [ :show, :stop, :claim, :discard, :keep ] before_filter :parse_filename, :only => [ :download, :upload_next_part, :upload_sign, :upload_part_complete, :upload_complete ] @@ -97,6 +97,7 @@ class ApiRecordingsController < ApiController comment.recording_id = params[:id] comment.creator_id = params[:user_id] comment.comment = params[:comment] + comment.ip_address = request.remote_ip comment.save if comment.errors.any? @@ -118,6 +119,7 @@ class ApiRecordingsController < ApiController liker = RecordingLiker.new liker.recording_id = params[:id] liker.liker_id = params[:user_id] + liker.ip_address = request.remote_ip liker.save if liker.errors.any? @@ -139,6 +141,7 @@ class ApiRecordingsController < ApiController play = RecordingPlay.new play.recording_id = params[:id] play.player_id = params[:user_id] + play.ip_address = request.remote_ip play.save if play.errors.any? @@ -209,10 +212,7 @@ class ApiRecordingsController < ApiController end end - - private - def parse_filename @recorded_track = RecordedTrack.find_by_recording_id_and_client_track_id!(params[:id], params[:track_id]) raise PermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR unless @recorded_track.recording.has_access?(current_user) diff --git a/web/app/controllers/music_sessions_controller.rb b/web/app/controllers/music_sessions_controller.rb index c72f6f22f..7087fdaad 100644 --- a/web/app/controllers/music_sessions_controller.rb +++ b/web/app/controllers/music_sessions_controller.rb @@ -1,50 +1,10 @@ class MusicSessionsController < ApplicationController - # have to be signed in currently to see this screen - before_filter :signed_in_user - respond_to :html - def index - @music_sessions = MusicSession.paginate(page: params[:page]) - end - def show - @music_session = MusicSession.find(params[:id]) - - # use gon to pass variables into javascript - gon.websocket_gateway_uri = Rails.application.config.websocket_gateway_uri - gon.music_session_id = @music_session.id - end - - def new - @music_session = MusicSession.new - end - - def create - @music_session = MusicSession.new() - @music_session.creator = current_user - @music_session.description = params[:jam_ruby_music_session][:description] - if @music_session.save - flash[:success] = "Music Session created" - redirect_to @music_session - else - render 'new' - end - end - - - def edit - end - - def update - - end - - def destroy - MusicSession.find(params[:id]).destroy - flash[:success] = "Jam Session deleted." - redirect_to music_sessions_url + @music_session = MusicSessionHistory.find_by_music_session_id(params[:id]) + render :layout => "web" end end diff --git a/web/app/controllers/recordings_controller.rb b/web/app/controllers/recordings_controller.rb new file mode 100644 index 000000000..650c6971f --- /dev/null +++ b/web/app/controllers/recordings_controller.rb @@ -0,0 +1,10 @@ +class RecordingsController < ApplicationController + + respond_to :html + + def show + @claimed_recording = ClaimedRecording.find(params[:id]) + render :layout => "web" + end + +end \ No newline at end of file diff --git a/web/app/views/api_claimed_recordings/show.rabl b/web/app/views/api_claimed_recordings/show.rabl index cb46530cd..36c020610 100644 --- a/web/app/views/api_claimed_recordings/show.rabl +++ b/web/app/views/api_claimed_recordings/show.rabl @@ -1,13 +1,13 @@ # I'm not sure this is right at all. The idea is to bring in all the stuff you would need to play the tracks. -# I don't think I need to include URLs since that's handled by syncing. This is jsut to make the metadata +# I don't think I need to include URLs since that's handled by syncing. This is just to make the metadata # depictable. object @claimed_recording -attributes :id, :name, :description, :is_public, :is_downloadable +attributes :id, :name, :description, :is_public, :is_downloadable, :genre_id child(:recording => :recording) { - attributes :id, :created_at, :duration + attributes :id, :created_at, :duration, :comment_count, :like_count, :play_count child(:band => :band) { attributes :id, :name } @@ -19,9 +19,20 @@ child(:recording => :recording) { child(:recorded_tracks => :recorded_tracks) { attributes :id, :fully_uploaded, :url, :client_track_id, :client_id, :instrument_id - child(:user => :user) { - attributes :id, :first_name, :last_name, :city, :state, :country, :photo_url - } + child(:user => :user) { + attributes :id, :first_name, :last_name, :city, :state, :country, :photo_url + } } -} + child(:band => :band) { + attributes :id, :name, :photo_url + } + + child(:comments => :comments) { + attributes :comment, :created_at + + child(:user => :creator) { + attributes :id, :first_name, :last_name, :photo_url + } + } +} \ No newline at end of file diff --git a/web/app/views/clients/_musicians.html.erb b/web/app/views/clients/_musicians.html.erb index 2b4c565de..8e21bdf57 100644 --- a/web/app/views/clients/_musicians.html.erb +++ b/web/app/views/clients/_musicians.html.erb @@ -20,45 +20,44 @@ <% end -%> - @@ -74,7 +73,7 @@ - <% end %> - <%= include_gon(:init => true) %> - <%= csrf_meta_tags %> - - -<%= javascript_include_tag "web/web" %> - + + + <%= stylesheet_link_tag "web/web", media: "all" %> + <% if bugsnag? %> + + + <% end %> + <%= include_gon(:init => true) %> + <%= csrf_meta_tags %> + + + <%= javascript_include_tag "web/web" %> + -
+
-
- -
<%= link_to root_path do %> <%= image_tag("web/logo_home.png", :alt => "JamKazam logo", :size => "298x54") %> <% end %>
+ +
+

Play music together over the Internet as if in the same room

+
+ + <%= render "users/user_dropdown" %> + +


-
- -
-
- <%= render "users/user_dropdown" %> +
+
+

<%= yield %>
-
+
<%= yield(:after_black_bar) %>
-
- <%= render "clients/invitationDialog" %> + <%= render "clients/invitationDialog" %> - + var userDropdown = new JK.UserDropdown(JK.app); + userDropdown.initialize(invitationDialog); + } + }) + -
- -<%= render "shared/ga" %> - - + <%= render "shared/ga" %> + + diff --git a/web/app/views/music_sessions/show.html.erb b/web/app/views/music_sessions/show.html.erb index d60140bb3..87a9146a6 100644 --- a/web/app/views/music_sessions/show.html.erb +++ b/web/app/views/music_sessions/show.html.erb @@ -1,24 +1,72 @@ -<% provide(:title, "Now Playing: #{@music_session.description}") %> -
- -
-

Internal Session Activity

-
-

Wait a moment...

-
-
+<% provide(:title, "#{@music_session.description}") %> + +
+ <% unless @music_session.band.nil? %> +
+ <% unless @music_session.band.photo_url.blank? %> + <%= image_tag "#{@music_session.band.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic_band.png", {:alt => ""} %> + <% end %> +
+ <%= @music_session.band.name %> + <% else %> +
+ <% unless @music_session.creator.photo_url.blank? %> + <%= image_tag "#{@music_session.creator.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic.png", {:alt => ""} %> + <% end %> +
+ <%= @music_session.creator.name %> + <% end %>
-<% content_for :post_scripts do %> - +
+
SESSION: Live Session in Progress
+
<%= @cmusic_session.created_at.strftime("%b %e %Y, %l:%M %p") %>
+

+

<%= @music_session.name %>

+ +
TODO: Which field is this in the database??

+
+ + +
<%= @music_session.genres.split('|').first.id.capitalize %>
+
+ <%= @music_session.comment_count %> + <%= image_tag "content/icon_comment.png", {:width => 13, :height => 12, :align => "absmiddle"} %>     + <%= @music_session.like_count %> + <%= image_tag "content/icon_like.png", {:width => 12, :height => 12, :align => "absmiddle"} %> +
+
+

+ <%= render :partial => "shared/track_details", :locals => {:tracks => @music_session.tracks} %> +
+
+ +<% if signed_in? %> + <% unless @music_session.band.nil? %> + <%= render :partial => "shared/landing_sidebar", :locals => {:user => @music_session.band, :recent_history => @music_session.band.recent_history} %> + <% else %> + <%= render :partial => "shared/landing_sidebar", :locals => {:user => @music_session.user, :recent_history => @music_session.user.recent_history} %> + <% end %> +<% else %> + <%= render :partial => "shared/cta_sidebar" %> <% end %> + +<% content_for :after_black_bar do %> +
+ <%= render :partial => "shared/comments", :locals => {:comments => @music_session.comments} %> +<% end %> + +<%= javascript_include_tag "web/sessions" %> + +<%= render "clients/shareDialog" %> diff --git a/web/app/views/recordings/show.html.erb b/web/app/views/recordings/show.html.erb new file mode 100644 index 000000000..a78b3e4b4 --- /dev/null +++ b/web/app/views/recordings/show.html.erb @@ -0,0 +1,80 @@ +<% provide(:title, "#{@claimed_recording.name}") %> + +
+ <% unless @claimed_recording.recording.band.nil? %> +
+ <% unless @claimed_recording.recording.band.photo_url.blank? %> + <%= image_tag "#{@claimed_recording.recording.band.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic_band.png", {:alt => ""} %> + <% end %> +
+ <%= @claimed_recording.recording.band.name %> + <% else %> +
+ <% unless @claimed_recording.recording.owner.photo_url.blank? %> + <%= image_tag "#{@claimed_recording.recording.owner.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic.png", {:alt => ""} %> + <% end %> +
+ <%= @claimed_recording.recording.owner.name %> + <% end %> +
+ +
+
RECORDING
+
<%= @claimed_recording.recording.created_at.strftime("%b %e %Y, %l:%M %p") %>
+

+

<%= @claimed_recording.name %>

+ +
TODO: Which field is this in the database??

+
+
+ <%= image_tag "content/icon_playbutton.png", {:width => 20, :height => 20} %> +
+
0:00
+
+
<%= image_tag "content/slider_playcontrols.png", {:width => 5, :height => 16} %>
+
+
4:59
+
+
1:23
+
+ +
<%= @claimed_recording.genre_id.capitalize %>
+
+ <%= @claimed_recording.recording.play_count %> + <%= image_tag "content/icon_arrow.png", {:width => 7, :height => 12, :align => "absmiddle"} %>     + <%= @claimed_recording.recording.comment_count %> + <%= image_tag "content/icon_comment.png", {:width => 13, :height => 12, :align => "absmiddle"} %>     + <%= @claimed_recording.recording.like_count %> + <%= image_tag "content/icon_like.png", {:width => 12, :height => 12, :align => "absmiddle"} %> +
+
+

+ <%= render :partial => "shared/track_details", :locals => {:tracks => @claimed_recording.recording.recorded_tracks} %> +
+
+ +<% if signed_in? %> + <% unless @claimed_recording.recording.band.nil? %> + <%= render :partial => "shared/landing_sidebar", :locals => {:user => @claimed_recording.recording.band, :recent_history => @claimed_recording.recording.band.recent_history} %> + <% else %> + <%= render :partial => "shared/landing_sidebar", :locals => {:user => @claimed_recording.recording.owner, :recent_history => @claimed_recording.recording.owner.recent_history} %> + <% end %> +<% else %> + <%= render :partial => "shared/cta_sidebar" %> +<% end %> + +<% content_for :after_black_bar do %> +
+ <%= render :partial => "shared/comments", :locals => {:comments => @claimed_recording.recording.comments} %> +<% end %> + + <%= javascript_include_tag "web/recordings" %> + +<%= render "clients/shareDialog" %> \ No newline at end of file diff --git a/web/app/views/shared/_comments.html.erb b/web/app/views/shared/_comments.html.erb new file mode 100644 index 000000000..955d8baae --- /dev/null +++ b/web/app/views/shared/_comments.html.erb @@ -0,0 +1,28 @@ +
+

Comments:


+
+ <%= image_tag "shared/avatar_generic.png", {:alt => ""} %> +
+
+ +
+
+ +
+ <% comments.each do |c| %> +
+ <% unless c.user.photo_url.blank? %> + <%= image_tag "#{c.user.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic.png", {:alt => ""} %> + <% end %> +
+
+ <%= c.user.name %> <%= c.comment %> +
+
<%= c.created_at.strftime("%b %e %Y, %l:%M %p") %>
+
+
+ <% end %> +
+
\ No newline at end of file diff --git a/web/app/views/shared/_cta_sidebar.html.erb b/web/app/views/shared/_cta_sidebar.html.erb new file mode 100644 index 000000000..7742e983b --- /dev/null +++ b/web/app/views/shared/_cta_sidebar.html.erb @@ -0,0 +1,10 @@ +
+ +

+ <%= image_tag "web/carousel_musicians.jpg", {:width => 350, :alt => ""} %>

+ <%= image_tag "web/carousel_fans.jpg", {:width => 350, :alt => ""} %>

+ <%= image_tag "web/carousel_bands.jpg", {:width => 350, :alt => ""} %> +
\ No newline at end of file diff --git a/web/app/views/shared/_landing_sidebar.html.erb b/web/app/views/shared/_landing_sidebar.html.erb new file mode 100644 index 000000000..36cb3abfb --- /dev/null +++ b/web/app/views/shared/_landing_sidebar.html.erb @@ -0,0 +1,26 @@ +

+

More by <%= user.name %>:


+
Now:
+ +
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis.
+

+
Yesterday:
+
RECORDING: You Hurt Me Bad
+
Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi.
+

+
Dec. 18th:
+
SESSION: Session Ended. Unavailable.
+
Nulla libero. Vivamus pharetra posuere sapien. Nam consectetuer. Sed aliquam, nunc eget euismod ullamcorper, lectus nunc ullamcorper orci, fermentum bibendum enim nibh eget ipsum.
+

+
Dec. 12th:
+
RECORDING: Bustin' My Chops
+
Donec porttitor ligula eu dolor. Maecenas vitae nulla consequat libero cursus venenatis. Nam magna enim, accumsan eu, blandit sed, blandit a, eros.
+

+
Dec. 10th:
+
SESSION: Session Ended. Unavailable.
+
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim.
+

+
Nov. 29th:
+
SESSION: Session Ended. Unavailable.
+
Nulla libero. Vivamus pharetra posuere sapien. Nam consectetuer.
+
\ No newline at end of file diff --git a/web/app/views/shared/_track_details.html.erb b/web/app/views/shared/_track_details.html.erb new file mode 100644 index 000000000..80bd42c68 --- /dev/null +++ b/web/app/views/shared/_track_details.html.erb @@ -0,0 +1,33 @@ + + <% tracks.each_with_index do |track, index| %> + <% if index % 2 == 0 %> + + + <% end %> + + <% if index % 2 > 0 %> + + <% end %> + <% end %> +
 
+ + + + + + + +
+
+ <% unless track.user.photo_url.blank? %> + <%= image_tag "#{track.user.photo_url}", {:alt => ""} %> + <% else %> + <%= image_tag "shared/avatar_generic.png", {:alt => ""} %> + <% end %> +
+
<%= track.user.name %>
+
+ <%= image_tag "content/icon_instrument_#{track.instrument_id.tr(" ", "_")}45.png", {:width => 32, :alt => "", :title => "#{track.instrument_id}"} %> +
+
+
\ No newline at end of file diff --git a/web/app/views/users/_user_dropdown.html.erb b/web/app/views/users/_user_dropdown.html.erb index 558e8d25c..842219322 100644 --- a/web/app/views/users/_user_dropdown.html.erb +++ b/web/app/views/users/_user_dropdown.html.erb @@ -1,17 +1,18 @@
+ + + + + <% if signed_in? %> - -
- -
-
+
-
    +
    • <%= link_to "Identity", '/client#/account/identity' %>
    • @@ -36,7 +37,7 @@ <% else %> - + <% end %> -
+
diff --git a/web/config/routes.rb b/web/config/routes.rb index 0abeb215f..dc7a1cfcd 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -6,7 +6,6 @@ SampleApp::Application.routes.draw do end resources :users - resources :sessions, only: [:new, :create, :destroy] #root to: 'static_pages#home' @@ -24,10 +23,14 @@ SampleApp::Application.routes.draw do match '/signin', to: 'sessions#new' match '/signout', to: 'sessions#destroy', via: :delete + # oauth match '/auth/:provider/callback', :to => 'sessions#oauth_callback' match '/auth/failure', :to => 'sessions#failure' + # session / recording landing pages + match '/sessions/:id' => 'music_sessions#show', :via => :get, :as => 'music_session_detail' + match '/recordings/:id' => 'recordings#show', :via => :get, :as => 'recording_detail' match '/isp', :to => 'users#isp' match '/isp/ping.jar', :to => redirect('/ping.jar') @@ -297,6 +300,8 @@ SampleApp::Application.routes.draw do match '/claimed_recordings/:id' => 'api_claimed_recordings#update', :via => :put match '/claimed_recordings/:id' => 'api_claimed_recordings#delete', :via => :delete + # Mixes + match '/mixes/schedule' => 'api_mixes#schedule', :via => :post match '/mixes/next' => 'api_mixes#next', :via => :get match '/mixes/:id/finish' => 'api_mixes#finish', :via => :put match '/mixes/:id/download' => 'api_mixes#download', :via => :get