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 f5ffebd98..f79e2e810 100644 --- a/ruby/lib/jam_ruby/models/music_session_user_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_user_history.rb @@ -5,6 +5,8 @@ module JamRuby self.primary_key = 'id' + default_scope order('user_id ASC') + attr_accessible :max_concurrent_connections, :session_removed_at, :rating validates_inclusion_of :rating, :in => -1..1, :allow_nil => true diff --git a/web/app/assets/javascripts/hoverRecording.js b/web/app/assets/javascripts/hoverRecording.js index 8ba1239c7..f3a1348d1 100644 --- a/web/app/assets/javascripts/hoverRecording.js +++ b/web/app/assets/javascripts/hoverRecording.js @@ -12,7 +12,7 @@ // this is replicated in recording.rb model var t = {}; - t.instrument_ids = [] + t.instrument_ids = []; $.each(recordedTracks, function(index, track) { if (index > 0) { if (recordedTracks[index-1].user.id !== recordedTracks[index].user.id) { @@ -23,7 +23,7 @@ tracks.push(t); } else { - if ($.inArray(track.instrument_id, t.instrument_ids)) { + if ($.inArray(track.instrument_id, t.instrument_ids) === -1) { t.instrument_ids.push(track.instrument_id); } } diff --git a/web/app/assets/javascripts/hoverSession.js b/web/app/assets/javascripts/hoverSession.js index 35a7baa5e..596559df5 100644 --- a/web/app/assets/javascripts/hoverSession.js +++ b/web/app/assets/javascripts/hoverSession.js @@ -8,6 +8,35 @@ var rest = context.JK.Rest(); var hoverSelector = "#session-hover"; + // assumes users are sorted by + function deDupUsers(users) { + var deDupedUsers = []; + + var u = {}; + + $.each(users, function(index, user) { + if (index > 0) { + // new user + if (users[index-1].user_id !== users[index].user_id) { + u = {}; + u.instruments = user.instruments; + u.user = user.user; + deDupedUsers.push(u); + } + else { + u.instruments += "|" + user.instruments; + } + } + else { + u.instruments = user.instruments; + u.user = user.user; + deDupedUsers.push(u); + } + }); + + return deDupedUsers; + } + this.showBubble = function($hoverElement) { return rest.getSessionHistory(sessionId) @@ -16,7 +45,9 @@ // musicians var musicianHtml = ''; - $.each(response.users, function(index, val) { + var deDupedUsers = deDupUsers(response.users); + + $.each(deDupedUsers, function(index, val) { var instrumentHtml = ''; musicianHtml += ''; @@ -24,7 +55,15 @@ instrumentHtml = '
'; var instruments = val.instruments.split("|"); + var deDupedInstruments = []; + $.each(instruments, function(index, instrument) { + if ($.inArray(instrument, deDupedInstruments) === -1) { + deDupedInstruments.push(instrument); + } + }); + + $.each(deDupedInstruments, function(index, instrument) { instrumentHtml += ' '; }); diff --git a/web/app/views/api_music_sessions/show_history.rabl b/web/app/views/api_music_sessions/show_history.rabl index 7c09994e2..a172d1afc 100644 --- a/web/app/views/api_music_sessions/show_history.rabl +++ b/web/app/views/api_music_sessions/show_history.rabl @@ -51,8 +51,6 @@ else pretty_scheduled_start(session, false) end - - child(:creator => :creator) { attributes :id, :name, :photo_url } @@ -62,10 +60,10 @@ else } child(:music_session_user_histories => :users) { - attributes :instruments + attributes :instruments, :user_id child(:user => :user) { - attributes :name, :photo_url + attributes :id, :name, :photo_url } } diff --git a/web/spec/features/rsvp_dialog_spec.rb b/web/spec/features/rsvp_dialog_spec.rb new file mode 100644 index 000000000..0d4ed57ac --- /dev/null +++ b/web/spec/features/rsvp_dialog_spec.rb @@ -0,0 +1,134 @@ +require 'spec_helper' + +describe "RSVP Dialogs", :js => true, :type => :feature, :capybara_feature => true do + + subject { page } + + let (:user) {FactoryGirl.create(:user)} + let (:rsvp_requester) {FactoryGirl.create(:user)} + let (:session) {FactoryGirl.create(:music_session, :creator => user, :scheduled_start => Time.now + 2.hours)} + let (:unstructured_rsvp_session) {FactoryGirl.create(:music_session, :creator => user, :is_unstructured_rsvp => true)} + + def create_slots(slots = []) + end + + def create_rsvp_requests(requests = []) + end + + # set up users, session, RSVP request data + before(:each) do + RsvpRequestRsvpSlot.delete_all + RsvpRequest.delete_all + RsvpSlot.delete_all + + fast_signin(user, Nav.find_session) + end + + describe "RSVP submission" do + + it "should show session info" do + + end + + it "should show only open slots for structured RSVP session" do + + end + + it "should show a single Play Any Instrument You Like slot for unstructured RSVP session" do + + end + + it "should allow a comment to be entered" do + + end + + it "should have Help, Cancel, and Submit RSVP buttons" do + + end + + end + + describe "RSVP cancellation" do + + it "should show session info" do + + end + + it "should have 2 cancellation options" do + + end + + it "should have Help, Cancel, and Cancel RSVP buttons" do + + end + + it "should show Recurs once... text for recurring session" do + + end + + it "should suppress Recurs once... text for non-recurring session" do + + end + + it "should allow cancellation of just this session" do + + end + + it "should allow cancellation of all future sessions" do + + end + + it "should allow a comment to be entered" do + + end + end + + describe "RSVP slot creation" do + + it "should prompt user when no open slots remain for structured RSVP session" do + # create 2 slots - acoustic guitar and drums + + # create 2 RSVP to acoustic guitar, create 2 RSVP to drums + + # navigate to Session Details screen and approve 1 RSVP for each slot + + # confirm music_session.open_slots.count == 0 + + # attempt to approve + + end + + it "should prompt user when no open slots remain for relevant instrument for structured RSVP session" do + + # create 2 slots - acoustic guitar and drums + + # create 2 RSVPs to acoustic guitar, create 1 RSVP to drums + + # confirm music_session.open_slots.count == 2 + + # navigate to Session Details screen and approve first RSVP + + # confirm music_session.open_slots.count == 1 + + # attempt to approve second RSVP - confirm dialog pops up + + # click No - confirm dialog closes + + # attempt to approve drums - confirm RSVP is approved without dialog + + # attempt to approve acoustic guitar again - confirm dialog pops + + # click Yes - confirm new slot is created for acoustic guitar, RSVP is tied to new slot and approved, and dialog closes + + # confirm music_session.open_slots.count == 0 + + end + + it "should not prompt user to create slot for unstructured RSVP session" do + # submit 2 RSVP requests + + # navigate to Session Details screen and approve both RSVPs, confirming the slot dialog does not pop up for either + end + end + +end \ No newline at end of file