From 6043aa59e2427d4ef3cb9d2c52a59089e7f08d32 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 21 Feb 2013 14:09:05 -0600 Subject: [PATCH 01/22] vrfs192: _handleLoginAck was not getting called due to refactoring, to fix merged the code into loggedIn; added this.heartbeatActive to enable testing --- app/assets/javascripts/jamkazam.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/jamkazam.js b/app/assets/javascripts/jamkazam.js index 520f20d8a..be974d1de 100644 --- a/app/assets/javascripts/jamkazam.js +++ b/app/assets/javascripts/jamkazam.js @@ -7,7 +7,7 @@ var JamKazam = context.JK.JamKazam = function() { var app; var logger = context.JK.logger; - var heartbeatInterval = null; + var heartbeatInterval=null; var opts = { layoutOpts: {} @@ -42,20 +42,18 @@ $(routes.handler); } - function _handleLoginAck(header, payload) { - var heartbeatMS = payload.heartbeat_interval * 1000; - logger.debug("Login ACK. Setting up heartbeat every " + heartbeatMS + " MS"); - heartbeatInterval = context.setInterval(_heartbeat, heartbeatMS); - } - function _heartbeat() { - var message = context.JK.MessageFactory.heartbeat(); - context.JK.JamServer.send(message); + if (app.heartbeatActive) { + var message = context.JK.MessageFactory.heartbeat(); + context.JK.JamServer.send(message); + } } function loggedIn(header, payload) { app.clientId = payload.client_id; - logger.debug("jamkazam.js: loggedIn. clientId now " + app.clientId); + var heartbeatMS = payload.heartbeat_interval * 1000; + logger.debug("jamkazam.js.loggedIn(): clientId now " + app.clientId + "; Setting up heartbeat every " + heartbeatMS + " MS"); + heartbeatInterval = context.setInterval(_heartbeat, heartbeatMS); } function registerLoginAck() { @@ -143,6 +141,9 @@ events(); }; + // enable temporary suspension of heartbeat for fine-grained control + this.heartbeatActive = true; + /** * Expose clientId as a public variable. * Will be set upon LOGIN_ACK From 16e28b5f3d9ea23c17c330bbfb459bb44325ae64 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 21 Feb 2013 19:42:56 -0600 Subject: [PATCH 02/22] added arg client_id from cookie to login_with_token --- app/assets/javascripts/AAB_message_factory.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/AAB_message_factory.js b/app/assets/javascripts/AAB_message_factory.js index 5c31c0a79..76f08b556 100644 --- a/app/assets/javascripts/AAB_message_factory.js +++ b/app/assets/javascripts/AAB_message_factory.js @@ -69,7 +69,10 @@ // create a login message using token (a cookie or similiar) factory.login_with_token = function(token) { - var login = { token : token }; + //context.JK.logger.debug("*** login_with_token: client_id = "+$.cookie("client_id")); + var login = { token : token, + client_id : $.cookie("client_id") + }; return client_container(msg.LOGIN, route_to.SERVER, login); }; From 5f67bf9234e14034f10d2a2b348db9b426a68e24 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 21 Feb 2013 19:43:30 -0600 Subject: [PATCH 03/22] in loggedIn, assign client_id cookie from payload --- app/assets/javascripts/jamkazam.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/jamkazam.js b/app/assets/javascripts/jamkazam.js index be974d1de..969c0b47f 100644 --- a/app/assets/javascripts/jamkazam.js +++ b/app/assets/javascripts/jamkazam.js @@ -51,6 +51,7 @@ function loggedIn(header, payload) { app.clientId = payload.client_id; + $.cookie('client_id', payload.client_id); var heartbeatMS = payload.heartbeat_interval * 1000; logger.debug("jamkazam.js.loggedIn(): clientId now " + app.clientId + "; Setting up heartbeat every " + heartbeatMS + " MS"); heartbeatInterval = context.setInterval(_heartbeat, heartbeatMS); From f56d6d322d56d943e3a5c6754e410ac5b113f47a Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 27 Feb 2013 17:45:07 -0500 Subject: [PATCH 04/22] VRFS-260 client search enhancements --- app/assets/javascripts/header.js | 2 +- app/assets/javascripts/searchResults.js | 68 +++++++++++++- .../stylesheets/client/searchResults.css.scss | 93 +++++++++++++++++++ app/views/api_search/index.rabl | 16 +++- app/views/api_users/show.rabl | 5 +- app/views/clients/_createSession.html.erb | 2 +- app/views/clients/_findSession.html.erb | 2 +- app/views/clients/_searchResults.html.erb | 34 +++++-- app/views/layouts/client.html.erb | 1 + 9 files changed, 205 insertions(+), 18 deletions(-) create mode 100644 app/assets/stylesheets/client/searchResults.css.scss diff --git a/app/assets/javascripts/header.js b/app/assets/javascripts/header.js index b6466ad45..fc3f5e2df 100644 --- a/app/assets/javascripts/header.js +++ b/app/assets/javascripts/header.js @@ -11,7 +11,7 @@ context.JK.Header = function(app) { var logger = context.JK.logger; - var searcher; // Will hold an instance to a JK.Searcher (search.js) + var searcher; // Will hold an instance to a JK.Searcher (search.js) var userMe = null; var instrumentAutoComplete; var instrumentIds = []; diff --git a/app/assets/javascripts/searchResults.js b/app/assets/javascripts/searchResults.js index ccdb50477..258973af2 100644 --- a/app/assets/javascripts/searchResults.js +++ b/app/assets/javascripts/searchResults.js @@ -7,6 +7,17 @@ var logger = context.JK.logger; var query; + // JW: TODO - I'm building a similar map in session.js + // At somepoint, we should refactor to somewhere we can share. + var instrument_logo_map = { + "acoustic guitar": '../assets/content/icon_instrument_guitar24.png', + "bass guitar": '../assets/content/icon_instrument_guitar24.png', + "electric guitar": '../assets/content/icon_instrument_guitar24.png', + "keyboard": '../assets/content/icon_instrument_keyboard24.png', + "saxophone": '/assets/content/icon_instrument_saxophone24.png', + "voice": '../assets/content/icon_instrument_vocal24.png' + }; + function beforeShow(data) { query = data.query; } @@ -15,16 +26,71 @@ // TODO remove me - just showing that you should // have access to the query variable from the search // box. - $('#show-query').text('Query is ' + query); + //$('#show-query').text('Query is ' + query); } function search(evt) { evt.stopPropagation(); + + $('#search-results').empty(); var query = $('#search-input').val(); context.location = '#/searchResults/:' + query; + + $('#query').html(query); + + var url = "/api/search?query=" + query; + $.ajax({ + type: "GET", + dataType: "json", + contentType: 'application/json', + url: url, + processData:false, + success: function(response) { + $.each(response.musicians, function(index, val) { + var template = $('#template-search-result').html(); + var searchResultHtml = context.JK.fillTemplate(template, { + userId: val.id, + avatar_url: + val.photo_url, + userName: val.name, + location: val.location, + instruments: getInstrumentHtml(val.instruments) + }); + $('#search-results').append(searchResultHtml); + }); + var resultCount = response.musicians.length; + $('#result-count').html(resultCount); + if (resultCount === 1) { + $('#result-count').append(" Result "); + } + else { + $('#result-count').append(" Results "); + } + }, + error: app.ajaxError + }); + return false; } + function sendFriendRequest() { + + } + + function getInstrumentHtml(instruments) { + var instrumentLogoHtml = ''; + if (instruments !== undefined) { + for (var i=0; i < instruments.length; i++) { + var inst = '../assets/content/icon_instrument_default24.png'; + if (instruments[i].instrument_id in instrument_logo_map) { + inst = instrument_logo_map[instruments[i].instrument_id]; + instrumentLogoHtml += ' '; + } + } + } + return instrumentLogoHtml; + } + function events() { // not sure it should go here long-term, but wiring // up the event handler for the search box in the sidebar. diff --git a/app/assets/stylesheets/client/searchResults.css.scss b/app/assets/stylesheets/client/searchResults.css.scss new file mode 100644 index 000000000..dfa2723a0 --- /dev/null +++ b/app/assets/stylesheets/client/searchResults.css.scss @@ -0,0 +1,93 @@ +.search-result-header { + width:100%; + padding:11px 0px 11px 0px; + background-color:#4c4c4c; + min-height:20px; + overflow-x:hidden; +} + +a.search-nav { + font-size:13px; + color:#fff; + text-decoration:none; + margin-right:40px; + float:left; + font-weight:200; + padding-bottom:4px; +} + +a.search-nav.active, a.search-nav.active:hover { + font-weight:700; + border-bottom:solid 3px #ed3618; +} + +a.search-nav:hover { + border-bottom: dotted 2px #ed3618; +} + +.search-result { + width:193px; + min-height:85px; + background-color:#242323; + position:relative; + float:left; + margin:10px 20px 10px 0px; + padding-bottom:5px; +} + +.search-connected { + background-color:#4c4c4c; + height:100%; + width:100%; + position:absolute; + top:0px; + left:0px; + text-align:center; + font-size:11px; + visibility:hidden; +} + +.search-connected a { + color:#B3DD15; +} + +.search-band-genres { + float:left; + width:40%; + font-size:10px; + margin-left:10px; + padding-right:5px; +} + +.search-result-name { + float:left; + font-size:12px; + margin-top:12px; + font-weight:bold; +} + +.search-result-location { + font-size:11px; + color:#D5E2E4; + font-weight:200; +} + +.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; +} \ No newline at end of file diff --git a/app/views/api_search/index.rabl b/app/views/api_search/index.rabl index ba13dce45..b6445f5a7 100644 --- a/app/views/api_search/index.rabl +++ b/app/views/api_search/index.rabl @@ -8,13 +8,25 @@ end unless @search.musicians.nil? || @search.musicians.size == 0 child(:musicians => :musicians) { - attributes :id, :first_name, :last_name, :location, :photo_url + attributes :id, :first_name, :last_name, :name, :location, :photo_url + + node :is_friend do |musician| + musician.friends?(current_user) + end + + child :musician_instruments => :instruments do + attributes :instrument_id, :description, :proficiency_level, :priority + end } end unless @search.fans.nil? || @search.fans.size == 0 child(:fans => :fans) { - attributes :id, :first_name, :last_name, :location, :photo_url + attributes :id, :first_name, :last_name, :name, :location, :photo_url + + node :is_friend do |fan| + fan.friends?(current_user) + end } end diff --git a/app/views/api_users/show.rabl b/app/views/api_users/show.rabl index 8d0831668..fdee4f67f 100644 --- a/app/views/api_users/show.rabl +++ b/app/views/api_users/show.rabl @@ -21,9 +21,6 @@ end unless @user.instruments.nil? || @user.instruments.size == 0 child :musician_instruments => :instruments do - attributes :description, :proficiency_level, :priority - node :instrument_id do |instrument| - instrument.instrument_id - end + attributes :description, :proficiency_level, :priority, :instrument_id end end \ No newline at end of file diff --git a/app/views/clients/_createSession.html.erb b/app/views/clients/_createSession.html.erb index 755253602..98f22b3aa 100644 --- a/app/views/clients/_createSession.html.erb +++ b/app/views/clients/_createSession.html.erb @@ -100,7 +100,7 @@
- +
diff --git a/app/views/clients/_findSession.html.erb b/app/views/clients/_findSession.html.erb index 37b149adb..754746fa0 100644 --- a/app/views/clients/_findSession.html.erb +++ b/app/views/clients/_findSession.html.erb @@ -38,7 +38,7 @@
REFRESH diff --git a/app/views/clients/_searchResults.html.erb b/app/views/clients/_searchResults.html.erb index bb5b3a10d..6b60579d4 100644 --- a/app/views/clients/_searchResults.html.erb +++ b/app/views/clients/_searchResults.html.erb @@ -1,19 +1,37 @@
-

search results

<%= render "screen_navigation" %>
-

Brian - fill this in from Jeff's mockups. Probably need templates for individual blocks

- -

+
+
for ""
+ +
+
+
+
+
- diff --git a/app/views/layouts/client.html.erb b/app/views/layouts/client.html.erb index 5a375af5b..cfbb629f8 100644 --- a/app/views/layouts/client.html.erb +++ b/app/views/layouts/client.html.erb @@ -23,6 +23,7 @@ <%= stylesheet_link_tag "client/createSession", media: "all" %> <%= stylesheet_link_tag "client/genreSelector", media: "all" %> <%= stylesheet_link_tag "client/sessionList", media: "all" %> + <%= stylesheet_link_tag "client/searchResults", media: "all" %> <%= include_gon %> <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> From 613c51177c72d4234c800070a5261893689c5bf3 Mon Sep 17 00:00:00 2001 From: Jonathon Wilson Date: Thu, 28 Feb 2013 08:23:33 -0700 Subject: [PATCH 05/22] Add higher contrast mouse over effect to home screen --- .../images/content/bkg_home_account_x.jpg | Bin 0 -> 5913 bytes app/assets/images/content/bkg_home_create_x.jpg | Bin 0 -> 8690 bytes app/assets/images/content/bkg_home_feed_x.jpg | Bin 0 -> 7354 bytes app/assets/images/content/bkg_home_find_x.jpg | Bin 0 -> 8565 bytes .../images/content/bkg_home_profile_x.jpg | Bin 0 -> 7229 bytes app/assets/stylesheets/client/home.css.scss | 16 ++++++++++++++++ 6 files changed, 16 insertions(+) create mode 100644 app/assets/images/content/bkg_home_account_x.jpg create mode 100644 app/assets/images/content/bkg_home_create_x.jpg create mode 100644 app/assets/images/content/bkg_home_feed_x.jpg create mode 100644 app/assets/images/content/bkg_home_find_x.jpg create mode 100644 app/assets/images/content/bkg_home_profile_x.jpg diff --git a/app/assets/images/content/bkg_home_account_x.jpg b/app/assets/images/content/bkg_home_account_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43cc67ff65b24fd01351c5b610453f16e35f38d1 GIT binary patch literal 5913 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 Ca*vb% literal 0 HcmV?d00001 diff --git a/app/assets/images/content/bkg_home_create_x.jpg b/app/assets/images/content/bkg_home_create_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e05cbda86ae27aa5d812c90f233992f1a07a949 GIT binary patch literal 8690 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 Jt51D7^xxlXlc*4K|#%9m}1XR&cNL@`(#ZSo( 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 LFCK?b9lie#Y%Lvk literal 0 HcmV?d00001 diff --git a/app/assets/images/content/bkg_home_find_x.jpg b/app/assets/images/content/bkg_home_find_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd93fbc4c4f35a7d2106c6e2bded02201e1baf98 GIT binary patch literal 8565 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 U&W9~$Ejoh!RQq3lBac4(53FcgRR910 literal 0 HcmV?d00001 diff --git a/app/assets/images/content/bkg_home_profile_x.jpg b/app/assets/images/content/bkg_home_profile_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d4fe73c7019fb0700e4c2ed1f2d6a38c6e77392 GIT binary patch literal 7229 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 literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/client/home.css.scss b/app/assets/stylesheets/client/home.css.scss index 2438666ba..dd1e7ebb9 100644 --- a/app/assets/stylesheets/client/home.css.scss +++ b/app/assets/stylesheets/client/home.css.scss @@ -43,5 +43,21 @@ .homecard.hover { border: 1px solid $translucent2 !important; + background-color: #b32712; +} +.homecard.createsession.hover { + background-image: url(/assets/content/bkg_home_create_x.jpg); +} +.homecard.findsession.hover { + background-image: url(/assets/content/bkg_home_find_x.jpg); +} +.homecard.profile.hover { + background-image: url(/assets/content/bkg_home_profile_x.jpg); +} +.homecard.feed.hover { + background-image: url(/assets/content/bkg_home_feed_x.jpg); +} +.homecard.account.hover { + background-image: url(/assets/content/bkg_home_account_x.jpg); } From bd82e1a1f43b4959e4235b0876b14a37f61ca25f Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 09:44:34 -0600 Subject: [PATCH 06/22] refactored server.onOpen, breaking out rememberLogin function --- app/assets/javascripts/JamServer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/JamServer.js b/app/assets/javascripts/JamServer.js index b21c5d526..b84ad3df7 100644 --- a/app/assets/javascripts/JamServer.js +++ b/app/assets/javascripts/JamServer.js @@ -56,12 +56,15 @@ server.socket.onclose = server.onClose; }; - server.onOpen = function() { - logger.log("server.onOpen"); + server.rememberLogin = function() { var token, loginMessage; token = $.cookie("remember_token"); loginMessage = msg_factory.login_with_token(token); server.send(loginMessage); + } + server.onOpen = function() { + logger.log("server.onOpen"); + server.rememberLogin(); }; server.onMessage = function(e) { From efa57d68a9f607b740aa8b3d9e7f3ea927372cb4 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 09:46:48 -0600 Subject: [PATCH 07/22] vrfs192: added remember_tokencookie assignment in loggedIn() function --- app/assets/javascripts/jamkazam.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/jamkazam.js b/app/assets/javascripts/jamkazam.js index 969c0b47f..453919d57 100644 --- a/app/assets/javascripts/jamkazam.js +++ b/app/assets/javascripts/jamkazam.js @@ -52,6 +52,8 @@ function loggedIn(header, payload) { app.clientId = payload.client_id; $.cookie('client_id', payload.client_id); + $.cookie('remember_token', payload.token); + var heartbeatMS = payload.heartbeat_interval * 1000; logger.debug("jamkazam.js.loggedIn(): clientId now " + app.clientId + "; Setting up heartbeat every " + heartbeatMS + " MS"); heartbeatInterval = context.setInterval(_heartbeat, heartbeatMS); From 66670137eb672faa344cdd7f0c3259ab51b39fb3 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 09:48:21 -0600 Subject: [PATCH 08/22] vrfs192: test bed for wsg heartbeat connction state mgmt --- app/views/sessions/connection_state.html.erb | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 app/views/sessions/connection_state.html.erb diff --git a/app/views/sessions/connection_state.html.erb b/app/views/sessions/connection_state.html.erb new file mode 100644 index 000000000..f110015b7 --- /dev/null +++ b/app/views/sessions/connection_state.html.erb @@ -0,0 +1,81 @@ +<% if Rails.env == "test" || Rails.env == "development" %> + +<% end %> From f4f6a28758b51a6c1cddece74bc3fe49b2393ac8 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 11:50:05 -0600 Subject: [PATCH 09/22] vrfs192: full cycle testing completed --- app/views/sessions/connection_state.html.erb | 79 ++++++++++++++++---- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/app/views/sessions/connection_state.html.erb b/app/views/sessions/connection_state.html.erb index f110015b7..2ead39ef2 100644 --- a/app/views/sessions/connection_state.html.erb +++ b/app/views/sessions/connection_state.html.erb @@ -11,10 +11,10 @@ $(document).ready(function() { JK.logger.log("onOpen OVERRIDE"); if ($.cookie("remember_token")) { JK.JamServer.rememberLogin(); -<% if params[:user] && params[:password] %> + <% if params[:user] && params[:password] %> } else { JK.JamServer.send(JK.MessageFactory.login_with_user_pass('<%=params[:user]%>', '<%=params[:password]%>')); -<% end %> + <% end %> } } JK.JamServer.connect(); @@ -22,24 +22,72 @@ $(document).ready(function() { JK.app = JK.JamKazam(); JK.app.initialize(); JK.app.heartbeatActive = false; + + var music_session_id; + + function music_session_contains_client_id(music_session) { + var pp = music_session['participants']; + for (ii=0; ii < pp.length; ii++) { + if (JK.app.client_id == pp[ii]['client_id']) return true; + } + return false; + } function isExpired() { // do a GET call and check for participant // confirm the participant is not there (based on client_id) + $.ajax({ + type: 'GET', + dataType: 'json', + contentType: 'application/json', + url: '/api/sessions/'+music_session_id, + processData: false, + success: function(data) { + if (music_session_contains_client_id(data)) { + // FIXME: report error; connection should be deleted + JK.logger.log("*** isExpired: ERROR: connection NOT deleted"); + } else { + JK.logger.log("*** isExpired: SUCCESS: connection deleted"); + } + }, + error:function (xhr, ajaxOptions, thrownError){ + if(xhr.status==404) { + JK.logger.log("*** isExpired: SUCCESS: 404"); + } + } + }); } - function isStale() { - // do a GET call and check for participant - // confirm the participant is there (based on client_id) - // send heartbeat to reset timer on connection - JK.JamServer.send(JK.MessageFactory.heartbeat()); - window.setTimeout(isExpired, - <%= (Rails.application.config.websocket_gateway_connect_time_expire + 1) * 1000 %>); + function isStale() { + // do a GET call and check for participant; confirm the participant is there (based on client_id) + $.ajax({ + type: 'GET', + dataType: 'json', + contentType: 'application/json', + url: '/api/sessions/'+music_session_id, + processData: false, + success: function(data) { + if (music_session_contains_client_id(data)) { + JK.logger.log("*** isStale: connection was found as expected"); + window.setTimeout(isExpired, + <%= (Rails.application.config.websocket_gateway_connect_time_expire + 1) * 1000 %>); + } else { + // FIXME: report error; connection should not be deleted + JK.logger.log("*** isStale: ERROR: connection was NOT FOUND"); + } + }, + error:function (xhr, ajaxOptions, thrownError){ + if(xhr.status==404) { + // FIXME: report error + JK.logger.log("*** isStale: ERROR: 404"); + } + } + }); } function createMusicSession() { var data = {}; - data.client_id = $.cookie('client_id'); + data.client_id = JK.app.client_id; //$.cookie('client_id'); data.description = 'asdf'; data.as_musician = true; data.legal_terms = true; @@ -49,16 +97,17 @@ $(document).ready(function() { data.fan_access = true; data.approval_required = true; data.tracks = [{instrument_id: 'electric guitar', sound: "mono"}]; - - var jsonData = JSON.stringify(data); + $.ajax({ type: 'POST', dataType: 'json', contentType: 'application/json', url: '/api/sessions/', - data: jsonData, + data: JSON.stringify(data), processData: false, success: function(data) { + music_session_id = data['id']; + JK.logger.log("*** createMusicSession: music_session_id = "+music_session_id); window.setTimeout(isStale, <%= (Rails.application.config.websocket_gateway_connect_time_stale + 1) * 1000 %>); }, @@ -67,15 +116,13 @@ $(document).ready(function() { } function myLoggedIn(header, payload) { + JK.app.client_id = payload.client_id; $.cookie('client_id', payload.client_id); $.cookie('remember_token', payload.token); createMusicSession(); } JK.JamServer.registerMessageCallback(JK.MessageType.LOGIN_ACK, myLoggedIn); -// JK.JamServer.send(JK.MessageFactory.login_with_token('VuBh9BIcK1dUvwIxRFai8w')); -//JK.JamServer.send(JK.MessageFactory.login_with_user_pass('<%=params[:user]%>', '<%=params[:password]%>')); - }); <% end %> From 1f065181b9132a2216efd1a4aa4d8d4adb7d04d5 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 11:58:21 -0600 Subject: [PATCH 10/22] vrfs192: formatting code --- app/views/sessions/connection_state.html.erb | 34 +++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/app/views/sessions/connection_state.html.erb b/app/views/sessions/connection_state.html.erb index 2ead39ef2..39133e997 100644 --- a/app/views/sessions/connection_state.html.erb +++ b/app/views/sessions/connection_state.html.erb @@ -8,7 +8,7 @@ $(document).ready(function() { // override the onOpen to manage login JK.JamServer.onOpen = function() { - JK.logger.log("onOpen OVERRIDE"); + JK.logger.log("*** onOpen: logging in"); if ($.cookie("remember_token")) { JK.JamServer.rememberLogin(); <% if params[:user] && params[:password] %> @@ -34,8 +34,7 @@ $(document).ready(function() { } function isExpired() { - // do a GET call and check for participant - // confirm the participant is not there (based on client_id) + // do a GET call and check for participant; confirm the participant is not there (based on client_id) $.ajax({ type: 'GET', dataType: 'json', @@ -86,18 +85,18 @@ $(document).ready(function() { } function createMusicSession() { - var data = {}; - data.client_id = JK.app.client_id; //$.cookie('client_id'); - data.description = 'asdf'; - data.as_musician = true; - data.legal_terms = true; - data.genres = ['classical']; - data.musician_access = true; - data.fan_chat = true; - data.fan_access = true; - data.approval_required = true; - data.tracks = [{instrument_id: 'electric guitar', sound: "mono"}]; - + var data = { + client_id: JK.app.client_id, + description: 'asdf', + as_musician: true, + legal_terms: true, + genres: ['classical'], + musician_access: true, + fan_chat: true, + fan_access: true, + approval_required: true, + tracks: [{instrument_id: 'electric guitar', sound: "mono"}] + } $.ajax({ type: 'POST', dataType: 'json', @@ -111,11 +110,14 @@ $(document).ready(function() { window.setTimeout(isStale, <%= (Rails.application.config.websocket_gateway_connect_time_stale + 1) * 1000 %>); }, - error: JK.app.ajaxError + error:function (xhr, ajaxOptions, thrownError){ + JK.logger.log("*** createMusicSession: ERROR: "+thrownError); + } }); } function myLoggedIn(header, payload) { + JK.logger.log("*** myLoggedIn: "); JK.app.client_id = payload.client_id; $.cookie('client_id', payload.client_id); $.cookie('remember_token', payload.token); From 1fd8fccd38e15e75fe197fe3972d4c8c0bab6a34 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 12:03:21 -0600 Subject: [PATCH 11/22] vrfs192: commenting code --- app/views/sessions/connection_state.html.erb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/views/sessions/connection_state.html.erb b/app/views/sessions/connection_state.html.erb index 39133e997..6a8450e8c 100644 --- a/app/views/sessions/connection_state.html.erb +++ b/app/views/sessions/connection_state.html.erb @@ -6,7 +6,7 @@ $(document).ready(function() { if (!(window.jamClient)) { window.jamClient = new JK.FakeJamClient(); } JK.currentUserId = '<%= params[:user_id] %>'; - // override the onOpen to manage login + // override the onOpen to manage login; do this before connect() JK.JamServer.onOpen = function() { JK.logger.log("*** onOpen: logging in"); if ($.cookie("remember_token")) { @@ -21,10 +21,13 @@ $(document).ready(function() { JK.app = JK.JamKazam(); JK.app.initialize(); + // disable normal heartbeat as we need to test without JK.app.heartbeatActive = false; + // cache of the music_session_id created in the test var music_session_id; + // checks all participants of a music_session for one with our client_id function music_session_contains_client_id(music_session) { var pp = music_session['participants']; for (ii=0; ii < pp.length; ii++) { @@ -32,7 +35,8 @@ $(document).ready(function() { } return false; } - + + // checks to see if the music_session has been deleted, as it should be after expire duration delay function isExpired() { // do a GET call and check for participant; confirm the participant is not there (based on client_id) $.ajax({ @@ -57,6 +61,7 @@ $(document).ready(function() { }); } + // after waiting for the stale duration, is the connection still available? if ok, run isExpire after delay function isStale() { // do a GET call and check for participant; confirm the participant is there (based on client_id) $.ajax({ @@ -104,8 +109,8 @@ $(document).ready(function() { url: '/api/sessions/', data: JSON.stringify(data), processData: false, - success: function(data) { - music_session_id = data['id']; + success: function(music_session) { + music_session_id = music_session['id']; JK.logger.log("*** createMusicSession: music_session_id = "+music_session_id); window.setTimeout(isStale, <%= (Rails.application.config.websocket_gateway_connect_time_stale + 1) * 1000 %>); From 4c6b6ea0bcaa2ce2c5a7c220bf56b9529248f5d6 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Thu, 28 Feb 2013 12:44:33 -0600 Subject: [PATCH 12/22] vrfs192: code cleanup --- app/controllers/sessions_controller.rb | 5 +++ app/views/sessions/connection_state.html.erb | 34 ++++++++++---------- config/application.rb | 5 ++- config/routes.rb | 2 ++ 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 4607e508a..d3188833e 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -76,4 +76,9 @@ class SessionsController < ApplicationController def failure end + + def connection_state + render('connection_state', :layout => 'client') + end + end diff --git a/app/views/sessions/connection_state.html.erb b/app/views/sessions/connection_state.html.erb index 6a8450e8c..2e15c4d70 100644 --- a/app/views/sessions/connection_state.html.erb +++ b/app/views/sessions/connection_state.html.erb @@ -2,13 +2,12 @@ + + From 2e9a65dbf840e5db3afd69ead766fd7a4d529c9e Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 3 Mar 2013 22:38:12 -0500 Subject: [PATCH 20/22] VRFS-206 remove hardcoded friend list in sidebar --- app/assets/javascripts/searchResults.js | 11 +--- app/assets/javascripts/sidebar.js | 80 +++++++++++++++++++++++++ app/views/api_users/friend_index.rabl | 2 +- app/views/clients/_sidebar.html.erb | 75 +++++------------------ app/views/clients/index.html.erb | 3 + 5 files changed, 101 insertions(+), 70 deletions(-) create mode 100644 app/assets/javascripts/sidebar.js diff --git a/app/assets/javascripts/searchResults.js b/app/assets/javascripts/searchResults.js index 9db735606..860a7e92d 100644 --- a/app/assets/javascripts/searchResults.js +++ b/app/assets/javascripts/searchResults.js @@ -14,10 +14,6 @@ } function afterShow(data) { - // TODO remove me - just showing that you should - // have access to the query variable from the search - // box. - //$('#show-query').text('Query is ' + query); } function search(evt) { @@ -98,9 +94,8 @@ data: '{"friend_id":"' + userId + '"}', processData: false, success: function(response) { - //alert($(this).parent().find('div[user-id=' + userId + '].search-connected')); + // toggle the pre-click and post-click divs $('div[user-id=' + userId + '].search-connected').show(); - //$(this).parent().find('div[user-id=' + userId + '].search-result').empty(); $('div[user-id=' + userId + '].search-result').hide(); }, error: app.ajaxError @@ -122,11 +117,7 @@ } function events() { - // not sure it should go here long-term, but wiring - // up the event handler for the search box in the sidebar. $('#searchForm').submit(search); - - $('#btn-connect-friend').on("click", sendFriendRequest); } this.initialize = function() { diff --git a/app/assets/javascripts/sidebar.js b/app/assets/javascripts/sidebar.js new file mode 100644 index 000000000..e1ca1e9a0 --- /dev/null +++ b/app/assets/javascripts/sidebar.js @@ -0,0 +1,80 @@ +(function(context,$) { + + "use strict"; + + context.JK = context.JK || {}; + context.JK.Sidebar = function(app) { + var logger = context.JK.logger; + + function populateFriendsPanel() { + + var url = "/api/users/" + context.JK.currentUserId + "/friends" + $.ajax({ + type: "GET", + dataType: "json", + contentType: 'application/json', + url: url, + processData: false, + success: function(response) { + $.each(response, function(index, val) { + + var css = val.online ? '' : 'offline'; + + // fill in template for Connect pre-click + var template = $('#template-friend-panel').html(); + var searchResultHtml = context.JK.fillTemplate(template, { + userId: val.id, + cssClass: css, + avatar_url: context.JK.resolveAvatarUrl(val.photo_url), + userName: val.name, + status: val.online ? 'Available' : 'Offline', + extra_info: '', + info_image_url: '' + }); + + $('#sidebar-friend-list').append(searchResultHtml); + }); + + // set friend count + $('#sidebar-friend-count').html(response.length); + }, + error: app.ajaxError + }); + + return false; + } + + function sendFriendRequest(evt) { + evt.stopPropagation(); + var userId = $(this).parent().attr('user-id'); + + //$(this).parent().empty(); + + var url = "/api/users/" + context.JK.currentUserId + "/friend_requests"; + $.ajax({ + type: "POST", + dataType: "json", + contentType: 'application/json', + url: url, + data: '{"friend_id":"' + userId + '"}', + processData: false, + success: function(response) { + // toggle the pre-click and post-click divs + $('div[user-id=' + userId + '].search-connected').show(); + $('div[user-id=' + userId + '].search-result').hide(); + }, + error: app.ajaxError + }); + } + + function events() { + populateFriendsPanel(); + } + + this.initialize = function() { + events(); + }; + + }; + +})(window,jQuery); \ No newline at end of file diff --git a/app/views/api_users/friend_index.rabl b/app/views/api_users/friend_index.rabl index 511a0d127..cfa21fade 100644 --- a/app/views/api_users/friend_index.rabl +++ b/app/views/api_users/friend_index.rabl @@ -1,3 +1,3 @@ object @user.friends -attributes :id, :first_name, :last_name, :city, :state, :country, :email, :online, :photo_url \ No newline at end of file +attributes :id, :first_name, :last_name, :name, :location, :email, :online, :photo_url \ No newline at end of file diff --git a/app/views/clients/_sidebar.html.erb b/app/views/clients/_sidebar.html.erb index 896a10565..6d4ed5f7b 100644 --- a/app/views/clients/_sidebar.html.erb +++ b/app/views/clients/_sidebar.html.erb @@ -26,67 +26,10 @@
-

friends
4

+

friends

-
    -
  • -
    - <%= image_tag "avatars/avatar_david.jpg" %> -
    -
    - David Wilson
    - - In Session, started at 12:34 pm - -
    -
    - <%= image_tag "shared/icon_session.png", :width=>24, :height=>24 %> -
    -
    -
  • - -
  • -
    - <%= image_tag "shared/avatar_creepyeye.jpg" %> -
    -
    - Brian Smith
    - Available -
    -
    -
    -
  • - -
  • -
    - <%= image_tag "shared/avatar_silverfox.jpg" %> -
    -
    - Peter Walker
    - - Recording: Seven Trails - -
    -
    - <%= image_tag "sidebar/icon_recording.png", :width=>24, :height=>24 %> -
    -
    -
  • - -
  • -
    - <%= image_tag "shared/avatar_saltnpepper.jpg" %> -
    -
    - Seth Call
    - - Offline - -
    -
    -
    -
  • +
@@ -222,3 +165,17 @@
+ + diff --git a/app/views/clients/index.html.erb b/app/views/clients/index.html.erb index 695b9ebd4..6f12e48d6 100644 --- a/app/views/clients/index.html.erb +++ b/app/views/clients/index.html.erb @@ -72,6 +72,9 @@ var header = new JK.Header(JK.app); header.initialize(); + var sidebar = new JK.Sidebar(JK.app); + sidebar.initialize(); + var homeScreen = new JK.HomeScreen(JK.app); homeScreen.initialize(); From 546fdf608c032ab747f92e6a3181629f183f3566 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 3 Mar 2013 22:39:10 -0500 Subject: [PATCH 21/22] fix test --- app/views/api_users/friend_index.rabl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/api_users/friend_index.rabl b/app/views/api_users/friend_index.rabl index cfa21fade..40eb8fd7c 100644 --- a/app/views/api_users/friend_index.rabl +++ b/app/views/api_users/friend_index.rabl @@ -1,3 +1,3 @@ object @user.friends -attributes :id, :first_name, :last_name, :name, :location, :email, :online, :photo_url \ No newline at end of file +attributes :id, :first_name, :last_name, :name, :location, :city, :state, :country, :email, :online, :photo_url \ No newline at end of file From 2cff8710a09f48001b0e9781851c90b7bbbf7069 Mon Sep 17 00:00:00 2001 From: Jonathon Wilson Date: Tue, 5 Mar 2013 08:51:20 -0700 Subject: [PATCH 22/22] Guard against users with no defined instruments --- app/assets/javascripts/createSession.js | 3 ++- app/assets/javascripts/sessionModel.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/createSession.js b/app/assets/javascripts/createSession.js index 8768ce4b7..b1b4336cb 100644 --- a/app/assets/javascripts/createSession.js +++ b/app/assets/javascripts/createSession.js @@ -128,12 +128,13 @@ } // FIXME TODO: + // This code is duplicated in sessionModel.js -- refactor // 1. If no previous session data, a single stereo track with the // top instrument in the user's profile. // 2. Otherwise, use the tracks from the last created session. // Defaulting to 1st instrument in profile always at the moment. var track = { instrument_id: "electric guitar", sound: "stereo" }; - if (context.JK.userMe.instruments.length) { + if (context.JK.userMe.instruments && context.JK.userMe.instruments.length) { track = { instrument_id: context.JK.userMe.instruments[0].instrument_id, sound: "stereo" diff --git a/app/assets/javascripts/sessionModel.js b/app/assets/javascripts/sessionModel.js index e54746f79..043a10289 100644 --- a/app/assets/javascripts/sessionModel.js +++ b/app/assets/javascripts/sessionModel.js @@ -199,7 +199,7 @@ // multiple tracks. // TODO: Defaulting to electric guitar... var track = { instrument_id: "electric guitar", sound: "stereo" }; - if (currentUser.instruments.length) { + if (currentUser.instruments && currentUser.instruments.length) { track = { instrument_id: currentUser.instruments[0].instrument_id, sound: "stereo"