From da7fc7d901bf949a5a925ac67711756affbb91ea Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 31 Mar 2014 03:28:04 +0100 Subject: [PATCH] * VRFS-1541 done from a code perspective... just need to do some admin work once posted --- db/manifest | 1 + db/up/order_event_session.sql | 1 + ruby/lib/jam_ruby/models/event_session.rb | 40 ++++++++++++- .../jam_ruby/models/music_session_history.rb | 4 ++ ruby/lib/jam_ruby/models/recording.rb | 5 +- .../assets/javascripts/feed_item_recording.js | 1 + web/app/assets/javascripts/web/welcome.js | 11 ---- .../stylesheets/web/audioWidgets.css.scss | 60 +++++++++++++------ web/app/views/events/_event_session.html.haml | 14 +++-- web/app/views/events/event.html.haml | 2 +- .../views/users/_feed_music_session.html.haml | 6 +- web/app/views/users/_feed_recording.html.haml | 15 +++-- web/spec/features/event_spec.rb | 16 ++++- 13 files changed, 131 insertions(+), 45 deletions(-) create mode 100644 db/up/order_event_session.sql diff --git a/db/manifest b/db/manifest index 3eeea65c4..baa454cbc 100755 --- a/db/manifest +++ b/db/manifest @@ -138,3 +138,4 @@ events_social_description.sql fix_broken_cities.sql notifications_with_text.sql notification_seen_at.sql +order_event_session.sql \ No newline at end of file diff --git a/db/up/order_event_session.sql b/db/up/order_event_session.sql new file mode 100644 index 000000000..ba36f8f94 --- /dev/null +++ b/db/up/order_event_session.sql @@ -0,0 +1 @@ +ALTER TABLE event_sessions ADD COLUMN ordinal INTEGER; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/event_session.rb b/ruby/lib/jam_ruby/models/event_session.rb index 7385de68d..9d4fa8a9d 100644 --- a/ruby/lib/jam_ruby/models/event_session.rb +++ b/ruby/lib/jam_ruby/models/event_session.rb @@ -1,6 +1,6 @@ class JamRuby::EventSession < ActiveRecord::Base - attr_accessible :event_id, :user_id, :band_id, :starts_at, :ends_at, :pinned_state, :position, :img_url, :img_width, :img_height, as: :admin + attr_accessible :event_id, :user_id, :band_id, :starts_at, :ends_at, :pinned_state, :position, :img_url, :img_width, :img_height, :ordinal, as: :admin belongs_to :user, class_name: 'JamRuby::User' belongs_to :band, class_name: 'JamRuby::Band' @@ -13,6 +13,44 @@ class JamRuby::EventSession < ActiveRecord::Base before_validation :sanitize_active_admin + def has_public_mixed_recordings? + public_mixed_recordings.length > 0 + end + + def public_mixed_recordings + recordings.select { |recording| recording if recording.has_mix? && recording.is_public? } + end + + def recordings + recordings=[] + + sessions.each do |session_history| + recordings = recordings + session_history.recordings + end + + recordings + end + + # ideally this is based on some proper association with the event, not such a slushy time grab + def sessions + if ready_display + query = MusicSessionHistory.where(fan_access: true).where(created_at: (self.starts_at - 12.hours)..(self.ends_at + 12.hours)) + if self.user_id + query = query.where(user_id: self.user_id) + elsif self.band_id + query = query.where(band_id: self.band_id) + else + raise 'invalid state in event_session_button' + end + query + else + [] + end + end + + def ready_display + self.starts_at && self.ends_at && (self.user_id || self.band_id) + end def sanitize_active_admin self.img_url = nil if self.img_url == '' self.user_id = nil if self.user_id == '' diff --git a/ruby/lib/jam_ruby/models/music_session_history.rb b/ruby/lib/jam_ruby/models/music_session_history.rb index 089969434..5e3637284 100644 --- a/ruby/lib/jam_ruby/models/music_session_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_history.rb @@ -157,6 +157,10 @@ module JamRuby music_session && music_session.mount end + def recordings + Recording.where(music_session_id: self.id) + end + def end_history self.update_attribute(:session_removed_at, Time.now) diff --git a/ruby/lib/jam_ruby/models/recording.rb b/ruby/lib/jam_ruby/models/recording.rb index 570734180..645ccf6b8 100644 --- a/ruby/lib/jam_ruby/models/recording.rb +++ b/ruby/lib/jam_ruby/models/recording.rb @@ -132,7 +132,7 @@ module JamRuby end def has_access?(user) - return users.exists?(user) + users.exists?(user) end # Start recording a session. @@ -342,6 +342,9 @@ module JamRuby save end + def is_public? + claimed_recordings.where(is_public: true).length > 0 + end # meant to be used as a way to 'pluck' a claimed_recording appropriate for user. def candidate_claimed_recording diff --git a/web/app/assets/javascripts/feed_item_recording.js b/web/app/assets/javascripts/feed_item_recording.js index 0d8793446..834aedae5 100644 --- a/web/app/assets/javascripts/feed_item_recording.js +++ b/web/app/assets/javascripts/feed_item_recording.js @@ -7,6 +7,7 @@ var claimedRecordingId = $parentElement.attr('data-claimed-recording-id'); var recordingId = $parentElement.attr('id'); + var mode = $parentElement.attr('data-mode'); var $feedItem = $parentElement; var $name = $('.name', $feedItem); diff --git a/web/app/assets/javascripts/web/welcome.js b/web/app/assets/javascripts/web/welcome.js index 0d72c6a76..2403fa2dc 100644 --- a/web/app/assets/javascripts/web/welcome.js +++ b/web/app/assets/javascripts/web/welcome.js @@ -61,17 +61,6 @@ }); $('.carousel').show() - - $.each($('.feed-entry'), function (index, feedEntry) { - var $feedEntry = $(this); - if ($feedEntry.is('.recording-entry')) { - new context.JK.FeedItemRecording($feedEntry); - } - else { - new context.JK.FeedItemSession($feedEntry); - } - }) - context.JK.TickDuration('.feed-entry.music-session-history-entry .inprogress .tick-duration'); if ($.QueryString['showVideo']) { diff --git a/web/app/assets/stylesheets/web/audioWidgets.css.scss b/web/app/assets/stylesheets/web/audioWidgets.css.scss index ce9b3c251..a21ce84e6 100644 --- a/web/app/assets/stylesheets/web/audioWidgets.css.scss +++ b/web/app/assets/stylesheets/web/audioWidgets.css.scss @@ -109,13 +109,43 @@ } } - .feed-entry { + position:relative; + display:block; + white-space:nowrap; + min-width:700px; + border-bottom:solid 1px #666; + max-height:74px; + overflow:hidden; + margin-top:20px; + + &:nth-child(1) { + margin-top:0; + } + + &[data-mode="minimal"] { + .avatar-small { + display:none; + } + .feed-type-title { + display:none; + } + .recording-controls-holder { + width: 65%; + float:left; + } + .name-and-description { + margin-left:0; + } + + min-width:300px; + border-bottom-width:0; + } + .session-controls, .recording-controls { display:inline-block; &.ended { background-color: #471f18; - } &.inprogress { @@ -129,6 +159,16 @@ } } + .recording-controls-holder { + float:right; + width:40%; + } + + .name-and-description { + float:left; + width:30%; + margin-left:20px; + } .recording-controls { .recording-position { width:70%; @@ -147,22 +187,6 @@ } } } -} - -.feed-entry { - position:relative; - display:block; - white-space:nowrap; - min-width:700px; - border-bottom:solid 1px #666; - max-height:74px; - overflow:hidden; - margin-top:20px; - - &:nth-child(1) { - margin-top:0; - } - /** &.animate-down { -webkit-transition: max-height height 2s; diff --git a/web/app/views/events/_event_session.html.haml b/web/app/views/events/_event_session.html.haml index 3bb2a449f..419dc9bb8 100644 --- a/web/app/views/events/_event_session.html.haml +++ b/web/app/views/events/_event_session.html.haml @@ -6,15 +6,19 @@ %span.event-title= event_session_title(event_session) .landing-details.event - .left.f20.teal.time - %strong - = event_session_start_hour(event_session) - .right.session-button - = event_session_button(event_session) + - unless event_session.has_public_mixed_recordings? + .left.f20.teal.time + %strong + = event_session_start_hour(event_session) + .right.session-button + = event_session_button(event_session) %br{ clear:'all' } .left.bio = event_session_description(event_session) + .left + - event_session.public_mixed_recordings.each do |recording| + = render :partial => "users/feed_recording", locals: { feed_item: recording, mode: 'minimal'} %br %br %br{ clear:'all' } \ No newline at end of file diff --git a/web/app/views/events/event.html.haml b/web/app/views/events/event.html.haml index 866dcbdc5..9a9248c6c 100644 --- a/web/app/views/events/event.html.haml +++ b/web/app/views/events/event.html.haml @@ -23,7 +23,7 @@ %h2 ARTIST LINEUP %br - = render :partial => "event_session", :collection => @event.event_sessions.order('starts_at') + = render :partial => "event_session", :collection => @event.event_sessions.order('ordinal, starts_at') %br{clear:'all'} diff --git a/web/app/views/users/_feed_music_session.html.haml b/web/app/views/users/_feed_music_session.html.haml index c64534191..ff40d20d6 100644 --- a/web/app/views/users/_feed_music_session.html.haml +++ b/web/app/views/users/_feed_music_session.html.haml @@ -68,4 +68,8 @@ %br{:clear => "all"}/ - %br/ \ No newline at end of file + %br/ +:javascript + $(function () { + new window.JK.FeedItemSession($('.feed-entry[data-music-session="#{feed_item.id}"]')); + }) \ No newline at end of file diff --git a/web/app/views/users/_feed_recording.html.haml b/web/app/views/users/_feed_recording.html.haml index 18f1b7b97..dc4051602 100644 --- a/web/app/views/users/_feed_recording.html.haml +++ b/web/app/views/users/_feed_recording.html.haml @@ -1,21 +1,24 @@ -.feed-entry.recording-entry{:id => feed_item.id, :'data-claimed-recording-id' => feed_item.candidate_claimed_recording.id} +/ default values for template +- mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full') + +.feed-entry.recording-entry{:id => feed_item.id, :'data-claimed-recording-id' => feed_item.candidate_claimed_recording.id, :'data-mode' => mode} / avatar .avatar-small.ib = recording_avatar(feed_item) / type and artist - .left.ml20.w15 + .left.ml20.w15.feed-type-title .title{hoveraction: 'recording', :'recording-id' => feed_item.candidate_claimed_recording.id } RECORDING .artist = recording_artist_name(feed_item) = timeago(feed_item.created_at, class: 'small created_at') / name and description - .left.ml20.w30 + .name-and-description .name.dotdotdot = recording_name(feed_item) .description.dotdotdot = recording_description(feed_item) / timeline and controls - .right.w40 + .recording-controls-holder / recording play controls .recording-controls{ class: feed_item.candidate_claimed_recording.has_mix? ? 'has-mix' : 'no-mix'} / play button @@ -83,3 +86,7 @@ %br{:clear => "all"}/ %br/ +:javascript + $(function () { + new window.JK.FeedItemRecording($('.feed-entry[data-claimed-recording-id="#{feed_item.candidate_claimed_recording.id}"]')); + }) diff --git a/web/spec/features/event_spec.rb b/web/spec/features/event_spec.rb index 4ea9dab33..7295f4416 100644 --- a/web/spec/features/event_spec.rb +++ b/web/spec/features/event_spec.rb @@ -115,15 +115,25 @@ describe "Events", :js => true, :type => :feature, :capybara_feature => true, :s @event_session2.starts_at = 4.hours.ago @event_session2.save! visit "/events/so_latency" - expect(page).to have_css(".landing-band.event[data-event-session=\"#{@event_session2.id}\"]") + first(".landing-band.event[data-event-session='#{@event_session2.id}']:nth-child(1)") # test that it sorts correctly by putting this later event second @event_session2.starts_at = 4.hours.from_now @event_session2.save! visit "/events/so_latency" - expect(page).to have_css(".landing-band.event[data-event-session=\"#{@event_session.id}\"]") - + first(".landing-band.event[data-event-session='#{@event_session.id}']:nth-child(1)") + # test that it sorts correctly by putting this later event first, because ordinal is specified + @event_session2.ordinal = 0 + @event_session2.save! + visit "/events/so_latency" + first(".landing-band.event[data-event-session='#{@event_session2.id}']:nth-child(1)") + # associate a recording, and verify that the display changes to have no description, but has a recording widget + mix = FactoryGirl.create(:mix) + mix.recording.music_session_id = music_session_history.id + mix.recording.save! + visit "/events/so_latency" + find(".feed-entry.recording-entry[data-claimed-recording-id='#{mix.recording.claimed_recordings[0].id}']") end end