From ef01c9a8f1863a8d8d439508a80f3cd56570f14f Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 07:38:47 -0600 Subject: [PATCH 01/17] vrfs1008: moved invite musician html into template for reuse in sessions page --- web/app/assets/javascripts/createSession.js | 1 + web/app/views/clients/_createSession.html.erb | 11 +---------- web/app/views/clients/_session.html.erb | 14 +++++++++++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 6a6f1a9dc..1345b3b7d 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -405,6 +405,7 @@ function initialize(invitationDialogInstance, friendSelectorDialogInstance) { friendSelectorDialog = friendSelectorDialogInstance; invitationDialog = invitationDialogInstance; + $('#create-session-invite-musicians').append(context.JK.fillTemplate($('#template-invite-session-musicians').html(), {})); events(); loadBands(); loadSessionSettings(); diff --git a/web/app/views/clients/_createSession.html.erb b/web/app/views/clients/_createSession.html.erb index abacce414..faa1ad847 100644 --- a/web/app/views/clients/_createSession.html.erb +++ b/web/app/views/clients/_createSession.html.erb @@ -84,16 +84,7 @@

invite musicians


-
- -
- Start typing friends' names or: -
-
-
-
+
diff --git a/web/app/views/clients/_session.html.erb b/web/app/views/clients/_session.html.erb index d044ff38c..86b69b577 100644 --- a/web/app/views/clients/_session.html.erb +++ b/web/app/views/clients/_session.html.erb @@ -70,7 +70,7 @@

live tracks

@@ -178,3 +178,15 @@ + From 8fdbc7cc08a41ad1f86e3e9e97f81c0b42223deb Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 10:11:26 -0600 Subject: [PATCH 02/17] vrfs1008: refactoring invite logic --- web/app/assets/javascripts/createSession.js | 142 +------------- web/app/assets/javascripts/inviteMusicians.js | 173 ++++++++++++++++++ web/app/assets/javascripts/session.js | 2 + .../clients/_inviteSessionMusicians.html.erb | 26 +++ web/app/views/clients/_session.html.erb | 13 +- web/app/views/clients/index.html.erb | 5 +- 6 files changed, 212 insertions(+), 149 deletions(-) create mode 100644 web/app/assets/javascripts/inviteMusicians.js create mode 100644 web/app/views/clients/_inviteSessionMusicians.html.erb diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 1345b3b7d..29e52754a 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -7,81 +7,19 @@ var logger = context.JK.logger; var rest = context.JK.Rest(); var realtimeMessaging = context.JK.JamServer; - var friendSelectorDialog = null; var invitationDialog = null; - var autoComplete = null; - var userNames = []; - var userIds = []; - var userPhotoUrls = []; + var inviteMusiciansDialog = null; var MAX_GENRES = 1; - var selectedFriendIds = {}; var sessionSettings = {}; function beforeShow(data) { - userNames = []; - userIds = []; - userPhotoUrls = []; + inviteMusiciansDialog.afterShow(data); context.JK.GenreSelectorHelper.render('#create-session-genre'); resetForm(); } function afterShow(data) { - friendSelectorDialog.setCallback(friendSelectorCallback); - - var friends = rest.getFriends({ id: context.JK.currentUserId }) - .done(function(friends) { - $.each(friends, function() { - userNames.push(this.name); - userIds.push(this.id); - userPhotoUrls.push(this.photo_url); - }); - - var autoCompleteOptions = { - lookup: { suggestions: userNames, data: userIds }, - onSelect: addInvitation - }; - - $('#friend-input').attr("placeholder", "Type a friend\'s name").prop('disabled', false); - - if (!autoComplete) { - autoComplete = $('#friend-input').autocomplete(autoCompleteOptions); - } - else { - autoComplete.setOptions(autoCompleteOptions); - } - - $(".autocomplete").width("150px"); - }) - .fail(function() { - $('#friend-input').attr("placeholder", "Unable to lookup friends"); - app.ajaxError(arguments); - }); - } - - function friendSelectorCallback(newSelections) { - var keys = Object.keys(newSelections); - for (var i=0; i < keys.length; i++) { - addInvitation(newSelections[keys[i]].userName, newSelections[keys[i]].userId); - } - } - - function addInvitation(value, data) { - if ($('#selected-friends div[user-id=' + data + ']').length === 0) { - var template = $('#template-added-invitation').html(); - var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); - $('#selected-friends').append(invitationHtml); - $('#friend-input').select(); - selectedFriendIds[data] = true; - } - else { - $('#friend-input').select(); - context.alert('Invitation already exists for this musician.'); - } - } - - function removeInvitation(evt) { - delete selectedFriendIds[$(evt.currentTarget).parent().attr('user-id')]; - $(evt.currentTarget).closest('.invitation').remove(); + inviteMusiciansDialog.afterShow(data); } function resetForm() { @@ -248,49 +186,12 @@ return false; } - function createInvitations(sessionId, onComplete) { - var callCount = 0; - var totalInvitations = 0; - $('#selected-friends .invitation').each(function(index, invitation) { - callCount++; - totalInvitations++; - var invite_id = $(invitation).attr('user-id'); - var invite = { - music_session: sessionId, - receiver: invite_id - }; - $.ajax({ - type: "POST", - url: "/api/invitations", - data: invite - }).done(function(response) { - callCount--; - }).fail(app.ajaxError); - }); - // TODO - this is the second time I've used this pattern. - // refactor to make a common utility for this. - function checker() { - if (callCount === 0) { - onComplete(); - } else { - context.setTimeout(checker, 10); - } - } - checker(); - return totalInvitations; - } - function events() { $('#create-session-form').on('submit', submitForm); $('#btn-create-session').on("click", submitForm); - $('#selected-friends').on("click", ".invitation a", removeInvitation); $('#musician-access').change(toggleMusicianAccess); $('#fan-access').change(toggleFanAccess); - $('#btn-choose-friends').click(function() { - friendSelectorDialog.showDialog(selectedFriendIds); - }); - $('div[layout-id="createSession"] .btn-email-invitation').click(function() { invitationDialog.showEmailDialog(); }); @@ -373,39 +274,10 @@ }); } - function searchFriends(query) { - if (query.length < 2) { - $('#friend-search-results').empty(); - return; - } - var url = "/api/search?query=" + query + "&userId=" + context.JK.currentUserId; - $.ajax({ - type: "GET", - url: url, - success: friendSearchComplete - }); - } - - function friendSearchComplete(response) { - // reset search results each time - $('#friend-search-results').empty(); - - // loop through each - $.each(response.friends, function() { - // only show friends who are musicians - if (this.musician === true) { - var template = $('#template-friend-search-results').html(); - var searchResultHtml = context.JK.fillTemplate(template, {userId: this.id, name: this.first_name + ' ' + this.last_name}); - $('#friend-search-results').append(searchResultHtml); - $('#friend-search-results').attr('style', 'display:block'); - } - }); - } - - function initialize(invitationDialogInstance, friendSelectorDialogInstance) { - friendSelectorDialog = friendSelectorDialogInstance; + function initialize(invitationDialogInstance, inviteMusiciansDialogInstance) { invitationDialog = invitationDialogInstance; - $('#create-session-invite-musicians').append(context.JK.fillTemplate($('#template-invite-session-musicians').html(), {})); + inviteMusiciansDialog = inviteMusiciansDialogInstance; + $('#create-session-invite-musicians').append(inviteMusiciansDialog.friendSelectorHTML); events(); loadBands(); loadSessionSettings(); @@ -420,8 +292,6 @@ this.submitForm = submitForm; this.validateForm = validateForm; this.loadBands = loadBands; - this.searchFriends = searchFriends; - this.addInvitation = addInvitation; return this; }; diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js new file mode 100644 index 000000000..bb3d45b2e --- /dev/null +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -0,0 +1,173 @@ +(function(context,$) { + + "use strict"; + + context.JK = context.JK || {}; + context.JK.InviteMusiciansDialog = function(app) { + var logger = context.JK.logger; + var userNames = []; + var userIds = []; + var userPhotoUrls = []; + var friendSelectorDialog = null; + var friendSelectorHTML = null; + var selectedFriendIds = {}; + var autoComplete = null; + var rest = context.JK.Rest(); + var selectedIds = {}; + var newSelections = {}; + var mySaveCallback; + + this. beforeShow = function(data) { + userNames = []; + userIds = []; + userPhotoUrls = []; + } + + this.afterShow = function(data) { + friendSelectorDialog.setCallback(friendSelectorCallback); + + var friends = rest.getFriends({ id: context.JK.currentUserId }) + .done(function(friends) { + $.each(friends, function() { + userNames.push(this.name); + userIds.push(this.id); + userPhotoUrls.push(this.photo_url); + }); + + var autoCompleteOptions = { + lookup: { suggestions: userNames, data: userIds }, + onSelect: addInvitation + }; + + $('#friend-input').attr("placeholder", "Type a friend\'s name").prop('disabled', false); + + if (!autoComplete) { + autoComplete = $('#friend-input').autocomplete(autoCompleteOptions); + } + else { + autoComplete.setOptions(autoCompleteOptions); + } + + $(".autocomplete").width("150px"); + }) + .fail(function() { + $('#friend-input').attr("placeholder", "Unable to lookup friends"); + app.ajaxError(arguments); + }); + } + + function friendSelectorCallback(newSelections) { + var keys = Object.keys(newSelections); + for (var i=0; i < keys.length; i++) { + addInvitation(newSelections[keys[i]].userName, newSelections[keys[i]].userId); + } + } + + function addInvitation(value, data) { + if ($('#selected-friends div[user-id=' + data + ']').length === 0) { + var template = $('#template-added-invitation').html(); + var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); + $('#selected-friends').append(invitationHtml); + $('#friend-input').select(); + selectedFriendIds[data] = true; + } + else { + $('#friend-input').select(); + context.alert('Invitation already exists for this musician.'); + } + } + + function removeInvitation(evt) { + delete selectedFriendIds[$(evt.currentTarget).parent().attr('user-id')]; + $(evt.currentTarget).closest('.invitation').remove(); + } + + function createInvitations(sessionId, onComplete) { + var callCount = 0; + var totalInvitations = 0; + $('#selected-friends .invitation').each(function(index, invitation) { + callCount++; + totalInvitations++; + var invite_id = $(invitation).attr('user-id'); + var invite = { + music_session: sessionId, + receiver: invite_id + }; + $.ajax({ + type: "POST", + url: "/api/invitations", + data: invite + }).done(function(response) { + callCount--; + }).fail(app.ajaxError); + }); + // TODO - this is the second time I've used this pattern. + // refactor to make a common utility for this. + function checker() { + if (callCount === 0) { + onComplete(); + } else { + context.setTimeout(checker, 10); + } + } + checker(); + return totalInvitations; + } + + function searchFriends(query) { + if (query.length < 2) { + $('#friend-search-results').empty(); + return; + } + var url = "/api/search?query=" + query + "&userId=" + context.JK.currentUserId; + $.ajax({ + type: "GET", + url: url, + success: friendSearchComplete + }); + } + + function friendSearchComplete(response) { + // reset search results each time + $('#friend-search-results').empty(); + + // loop through each + $.each(response.friends, function() { + // only show friends who are musicians + if (this.musician === true) { + var template = $('#template-friend-search-results').html(); + var searchResultHtml = context.JK.fillTemplate(template, {userId: this.id, name: this.first_name + ' ' + this.last_name}); + $('#friend-search-results').append(searchResultHtml); + $('#friend-search-results').attr('style', 'display:block'); + } + }); + } + + function events() { + $('#btn-choose-friends').click(function() { + friendSelectorDialog.showDialog(selectedFriendIds); + }); + $('#selected-friends').on("click", ".invitation a", removeInvitation); + } + + function showDialog(ids) { + } + + this.initialize = function(friendSelectorDialogInstance) { + friendSelectorDialog = friendSelectorDialogInstance; + friendSelectorHTML = context.JK.fillTemplate($('#template-session-invite-musicians').html()); + events(); + }; + + this.setCallback = function(callback) { + mySaveCallback = callback; + } + + this.searchFriends = searchFriends; + this.addInvitation = addInvitation; + + this.showDialog = showDialog; + return this; + }; + +})(window,jQuery); \ No newline at end of file diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 4245dbee8..311134271 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -14,6 +14,8 @@ var addNewGearDialog; var localRecordingsDialog = null; var recordingFinishedDialog = null; + var friendSelectorDialog = null; + var inviteMusicianDialog = null; var screenActive = false; var currentMixerRangeMin = null; var currentMixerRangeMax = null; diff --git a/web/app/views/clients/_inviteSessionMusicians.html.erb b/web/app/views/clients/_inviteSessionMusicians.html.erb new file mode 100644 index 000000000..c47606211 --- /dev/null +++ b/web/app/views/clients/_inviteSessionMusicians.html.erb @@ -0,0 +1,26 @@ + +
+
+
+
+
+ CANCEL  +
+
+ INVITE +
+
+ + + diff --git a/web/app/views/clients/_session.html.erb b/web/app/views/clients/_session.html.erb index 86b69b577..f4f90c341 100644 --- a/web/app/views/clients/_session.html.erb +++ b/web/app/views/clients/_session.html.erb @@ -178,15 +178,4 @@ - + diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index bbd434dbf..da5464594 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -105,6 +105,9 @@ var friendSelectorDialog = new JK.FriendSelectorDialog(JK.app); friendSelectorDialog.initialize(); + var inviteMusiciansDialog = new JK.InviteMusiciansDialog(JK.app); + inviteMusiciansDialog.initialize(friendSelectorDialog); + var userDropdown = new JK.UserDropdown(JK.app); JK.UserDropdown = userDropdown; userDropdown.initialize(invitationDialog); @@ -148,7 +151,7 @@ JK.Banner.initialize(); var createSessionScreen = new JK.CreateSessionScreen(JK.app); - createSessionScreen.initialize(invitationDialog, friendSelectorDialog); + createSessionScreen.initialize(invitationDialog, inviteMusiciansDialog); var bandSetupScreen = new JK.BandSetupScreen(JK.app); bandSetupScreen.initialize(invitationDialog, friendSelectorDialog); From f3ab5f829712c34b4f3064caac67d63c22f134fa Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 10:35:34 -0600 Subject: [PATCH 03/17] vrfs1008: createSession invite refactor integration --- web/app/assets/javascripts/createSession.js | 2 +- web/app/assets/javascripts/inviteMusicians.js | 10 ++++++++-- web/app/views/clients/_createSession.html.erb | 6 ------ web/app/views/clients/_inviteSessionMusicians.html.erb | 5 +++++ web/app/views/clients/index.html.erb | 1 + 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 29e52754a..719be1472 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -277,7 +277,7 @@ function initialize(invitationDialogInstance, inviteMusiciansDialogInstance) { invitationDialog = invitationDialogInstance; inviteMusiciansDialog = inviteMusiciansDialogInstance; - $('#create-session-invite-musicians').append(inviteMusiciansDialog.friendSelectorHTML); + $('#create-session-invite-musicians').append(inviteMusiciansDialog.friendSelectorHTML()); events(); loadBands(); loadSessionSettings(); diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index bb3d45b2e..3a53f04d8 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -9,7 +9,7 @@ var userIds = []; var userPhotoUrls = []; var friendSelectorDialog = null; - var friendSelectorHTML = null; + var _friendSelectorHTML = null; var selectedFriendIds = {}; var autoComplete = null; var rest = context.JK.Rest(); @@ -153,9 +153,15 @@ function showDialog(ids) { } + this.friendSelectorHTML = function() { + if (_friendSelectorHTML === null) { + _friendSelectorHTML = context.JK.fillTemplate($('#template-session-invite-musicians').html(),{}); + } + return _friendSelectorHTML; + } + this.initialize = function(friendSelectorDialogInstance) { friendSelectorDialog = friendSelectorDialogInstance; - friendSelectorHTML = context.JK.fillTemplate($('#template-session-invite-musicians').html()); events(); }; diff --git a/web/app/views/clients/_createSession.html.erb b/web/app/views/clients/_createSession.html.erb index faa1ad847..56e5304a4 100644 --- a/web/app/views/clients/_createSession.html.erb +++ b/web/app/views/clients/_createSession.html.erb @@ -86,12 +86,6 @@
- -
-
- -
-
Invite friends and contacts to join you on JamKazam from:
diff --git a/web/app/views/clients/_inviteSessionMusicians.html.erb b/web/app/views/clients/_inviteSessionMusicians.html.erb index c47606211..278fce9de 100644 --- a/web/app/views/clients/_inviteSessionMusicians.html.erb +++ b/web/app/views/clients/_inviteSessionMusicians.html.erb @@ -23,4 +23,9 @@

+ +
+
+ +
diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index da5464594..56cee55ab 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -35,6 +35,7 @@ <%= render "account_profile_avatar" %> <%= render "account_audio_profile" %> <%= render "invitationDialog" %> +<%= render "inviteSessionMusicians" %> <%= render "whatsNextDialog" %> <%= render "recordingFinishedDialog" %> <%= render "localRecordingsDialog" %> From d9d240541d2f89a46641cb8b81fea5643875ef1a Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 14:50:56 -0600 Subject: [PATCH 04/17] vrfs1008: fixing integration of refactoring with createsession --- web/app/assets/javascripts/createSession.js | 2 +- web/app/assets/javascripts/inviteMusicians.js | 16 ++++++++++------ .../stylesheets/client/createSession.css.scss | 2 +- .../clients/_inviteSessionMusicians.html.erb | 4 ++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 719be1472..8cda52311 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -277,7 +277,7 @@ function initialize(invitationDialogInstance, inviteMusiciansDialogInstance) { invitationDialog = invitationDialogInstance; inviteMusiciansDialog = inviteMusiciansDialogInstance; - $('#create-session-invite-musicians').append(inviteMusiciansDialog.friendSelectorHTML()); + inviteMusiciansDialog.appendFriendSelector($('#create-session-invite-musicians')); events(); loadBands(); loadSessionSettings(); diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 3a53f04d8..a79e7ab6a 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -64,10 +64,10 @@ } function addInvitation(value, data) { - if ($('#selected-friends div[user-id=' + data + ']').length === 0) { + if ($('.selected-friends div[user-id=' + data + ']').length === 0) { var template = $('#template-added-invitation').html(); var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); - $('#selected-friends').append(invitationHtml); + $('.selected-friends').append(invitationHtml); $('#friend-input').select(); selectedFriendIds[data] = true; } @@ -85,7 +85,7 @@ function createInvitations(sessionId, onComplete) { var callCount = 0; var totalInvitations = 0; - $('#selected-friends .invitation').each(function(index, invitation) { + $('.selected-friends .invitation').each(function(index, invitation) { callCount++; totalInvitations++; var invite_id = $(invitation).attr('user-id'); @@ -144,10 +144,10 @@ } function events() { - $('#btn-choose-friends').click(function() { + $('.selected-friends').on("click", ".invitation a", removeInvitation); + $('.btn-choose-friends').click(function(){ friendSelectorDialog.showDialog(selectedFriendIds); }); - $('#selected-friends').on("click", ".invitation a", removeInvitation); } function showDialog(ids) { @@ -160,9 +160,13 @@ return _friendSelectorHTML; } + this.appendFriendSelector = function(elem) { + elem.append(this.friendSelectorHTML()); + events(); + }; + this.initialize = function(friendSelectorDialogInstance) { friendSelectorDialog = friendSelectorDialogInstance; - events(); }; this.setCallback = function(callback) { diff --git a/web/app/assets/stylesheets/client/createSession.css.scss b/web/app/assets/stylesheets/client/createSession.css.scss index c9fe9d001..3d189bae2 100644 --- a/web/app/assets/stylesheets/client/createSession.css.scss +++ b/web/app/assets/stylesheets/client/createSession.css.scss @@ -11,7 +11,7 @@ } } -#btn-choose-friends { +.btn-choose-friends { margin:0; } #create-session-genre select, #create-session-band select { diff --git a/web/app/views/clients/_inviteSessionMusicians.html.erb b/web/app/views/clients/_inviteSessionMusicians.html.erb index 278fce9de..f7a9c6683 100644 --- a/web/app/views/clients/_inviteSessionMusicians.html.erb +++ b/web/app/views/clients/_inviteSessionMusicians.html.erb @@ -15,7 +15,7 @@ From ddcfef56c43858053dd5ad44fe472d214fcdffd7 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 14:57:22 -0600 Subject: [PATCH 05/17] vrfs1008: added hook to external createInvitations function --- web/app/assets/javascripts/createSession.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 8cda52311..8acf248c0 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -164,7 +164,7 @@ data: jsonData, success: function(response) { var newSessionId = response.id; - var invitationCount = createInvitations(newSessionId, function() { + var invitationCount = inviteMusiciansDialog.createInvitations(newSessionId, function() { context.location = '#/session/' + newSessionId; }); // Re-loading the session settings will cause the form to reset with the right stuff in it. From a923025a80d1e46ed8202b51764eae103a6c91e7 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 18:35:05 -0600 Subject: [PATCH 06/17] vrfs1008: changed createInvitations to be anon fcn --- web/app/assets/javascripts/inviteMusicians.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index a79e7ab6a..89a60aab3 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -82,7 +82,7 @@ $(evt.currentTarget).closest('.invitation').remove(); } - function createInvitations(sessionId, onComplete) { + this.createInvitations = function(sessionId, onComplete) { var callCount = 0; var totalInvitations = 0; $('.selected-friends .invitation').each(function(index, invitation) { From 3e2ae677fe67e1ec97e44b8100246f491be50472 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 19:00:42 -0600 Subject: [PATCH 07/17] vrfs1008: integration with active session --- web/app/assets/javascripts/inviteMusicians.js | 1 + web/app/assets/javascripts/session.js | 10 ++++++++-- web/app/controllers/api_music_sessions_controller.rb | 1 + web/app/views/clients/_session.html.erb | 4 ++-- web/app/views/clients/index.html.erb | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 89a60aab3..b9b253bd8 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -151,6 +151,7 @@ } function showDialog(ids) { + //alert('showDialog'); } this.friendSelectorHTML = function() { diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 311134271..d6bd28b2e 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -15,7 +15,7 @@ var localRecordingsDialog = null; var recordingFinishedDialog = null; var friendSelectorDialog = null; - var inviteMusicianDialog = null; + var inviteMusiciansDialog = null; var screenActive = false; var currentMixerRangeMin = null; var currentMixerRangeMax = null; @@ -1304,12 +1304,17 @@ } } + function inviteMusicians() { + inviteMusiciansDialog.showDialog(); + } + function events() { $('#session-resync').on('click', sessionResync); $('#session-contents').on("click", '[action="delete"]', deleteSession); $('#tracks').on('click', 'div[control="mute"]', toggleMute); $('#recording-start-stop').on('click', startStopRecording); $('#open-a-recording').on('click', openRecording); + $('#session-invite-musicians').on('click', inviteMusicians); $('#track-settings').click(function() { configureTrackDialog.showVoiceChatPanel(true); configureTrackDialog.showMusicAudioPanel(true); @@ -1321,9 +1326,10 @@ .on('change-position', onChangePlayPosition); } - this.initialize = function(localRecordingsDialogInstance, recordingFinishedDialogInstance) { + this.initialize = function(localRecordingsDialogInstance, recordingFinishedDialogInstance, inviteMusiciansDialogInstance) { localRecordingsDialog = localRecordingsDialogInstance; recordingFinishedDialog = recordingFinishedDialogInstance; + inviteMusiciansDialog = inviteMusiciansDialogInstance; context.jamClient.SetVURefreshRate(150); playbackControls = new context.JK.PlaybackControls($('.session-recordings .recording-controls')); events(); diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index 79b8cfe84..f24ed56ee 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -45,6 +45,7 @@ class ApiMusicSessionsController < ApiController params[:legal_terms]) if @music_session.errors.any? + byebug # we have to do this because api_session_detail_url will fail with a bad @music_session response.status = :unprocessable_entity respond_with @music_session diff --git a/web/app/views/clients/_session.html.erb b/web/app/views/clients/_session.html.erb index f4f90c341..308178ef1 100644 --- a/web/app/views/clients/_session.html.erb +++ b/web/app/views/clients/_session.html.erb @@ -69,8 +69,8 @@

live tracks

-
- + diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index 56cee55ab..42586fd45 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -174,7 +174,7 @@ findBandScreen.initialize(); var sessionScreen = new JK.SessionScreen(JK.app); - sessionScreen.initialize(localRecordingsDialog, recordingFinishedDialog); + sessionScreen.initialize(localRecordingsDialog, recordingFinishedDialog, inviteMusiciansDialog); var sessionSettingsDialog = new JK.SessionSettingsDialog(JK.app, sessionScreen); sessionSettingsDialog.initialize(); From 895866398743d8034415ec279ed17c5c2b61b68e Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 19:01:11 -0600 Subject: [PATCH 08/17] vrfs1008: removed debug stmt --- web/app/controllers/api_music_sessions_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index f24ed56ee..79b8cfe84 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -45,7 +45,6 @@ class ApiMusicSessionsController < ApiController params[:legal_terms]) if @music_session.errors.any? - byebug # we have to do this because api_session_detail_url will fail with a bad @music_session response.status = :unprocessable_entity respond_with @music_session From 11074044a70834fea40e09914332523ac9f13134 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 19:37:52 -0600 Subject: [PATCH 09/17] vrfs1008: --- web/app/assets/javascripts/inviteMusicians.js | 4 +++- web/app/views/clients/_inviteSessionMusicians.html.erb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index b9b253bd8..17c08459d 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -151,7 +151,9 @@ } function showDialog(ids) { - //alert('showDialog'); + if (0 == $('#join-session-invite-musicians .friendbox').length) { + this.appendFriendSelector($('#join-session-invite-musicians')); + } } this.friendSelectorHTML = function() { diff --git a/web/app/views/clients/_inviteSessionMusicians.html.erb b/web/app/views/clients/_inviteSessionMusicians.html.erb index f7a9c6683..6963c4f10 100644 --- a/web/app/views/clients/_inviteSessionMusicians.html.erb +++ b/web/app/views/clients/_inviteSessionMusicians.html.erb @@ -1,6 +1,6 @@
-
+

From 33c64c28811125fdf24d4c276d483be0f905a756 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 22:33:32 -0600 Subject: [PATCH 10/17] vrfs1008: fixing integration bugs --- web/app/assets/javascripts/createSession.js | 4 +-- web/app/assets/javascripts/inviteMusicians.js | 36 ++++++++++++++----- web/app/assets/javascripts/session.js | 2 +- .../controllers/api_invitations_controller.rb | 7 ++-- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 8acf248c0..b5c7808bf 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -13,13 +13,13 @@ var sessionSettings = {}; function beforeShow(data) { - inviteMusiciansDialog.afterShow(data); + inviteMusiciansDialog.clearSelections(); context.JK.GenreSelectorHelper.render('#create-session-genre'); resetForm(); } function afterShow(data) { - inviteMusiciansDialog.afterShow(data); + inviteMusiciansDialog.loadFriends(); } function resetForm() { diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 17c08459d..74e767f73 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -17,13 +17,17 @@ var newSelections = {}; var mySaveCallback; - this. beforeShow = function(data) { + this.clearSelections = function() { userNames = []; userIds = []; userPhotoUrls = []; - } + selectedIds = {}; + selectedFriendIds = {}; + newSelections = {}; + $('.selected-friends').empty(); + }; - this.afterShow = function(data) { + this.loadFriends = function() { friendSelectorDialog.setCallback(friendSelectorCallback); var friends = rest.getFriends({ id: context.JK.currentUserId }) @@ -144,16 +148,32 @@ } function events() { - $('.selected-friends').on("click", ".invitation a", removeInvitation); - $('.btn-choose-friends').click(function(){ - friendSelectorDialog.showDialog(selectedFriendIds); - }); + if ($('.btn-choose-friends').data('events') === undefined) { + $('.selected-friends').on("click", ".invitation a", removeInvitation); + $('.btn-choose-friends').click(function(){ + friendSelectorDialog.showDialog(selectedFriendIds); + }); + } } - function showDialog(ids) { + function showDialog(sessionId) { if (0 == $('#join-session-invite-musicians .friendbox').length) { this.appendFriendSelector($('#join-session-invite-musicians')); } + selectedFriendIds = {}; + $.ajax({ + ajax: false, + url: "/api/invitations", + data: { + session_id: sessionId, + sender: context.JK.currentUserId + } + }).done(function(response) { + response.map(function(item) { + selectedFriendIds[item['receiver']['id']] = true; + }); + logger.debug(selectedFriendIds); + }).fail(app.ajaxError); } this.friendSelectorHTML = function() { diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index d6bd28b2e..ba21b7340 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1305,7 +1305,7 @@ } function inviteMusicians() { - inviteMusiciansDialog.showDialog(); + inviteMusiciansDialog.showDialog(sessionId); } function events() { diff --git a/web/app/controllers/api_invitations_controller.rb b/web/app/controllers/api_invitations_controller.rb index 266f97d6d..1de124bec 100644 --- a/web/app/controllers/api_invitations_controller.rb +++ b/web/app/controllers/api_invitations_controller.rb @@ -14,8 +14,11 @@ class ApiInvitationsController < ApiController if current_user.id != sender_id raise PermissionError, "You can only ask for your own sent invitations" end - - @invitations = Invitation.where(:sender_id => current_user.id) + if session_id = params[:session_id] + @invitations = Invitation.where(:sender_id => sender_id, :music_session_id => session_id) + else + @invitations = Invitation.where(:sender_id => current_user.id) + end elsif !receiver_id.nil? if current_user.id != receiver_id raise PermissionError, "You can only ask for your own received invitations" From a8b7f3e5a610d8a87c3aaa56cdf0cb9ceea72551 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Mon, 13 Jan 2014 23:18:09 -0600 Subject: [PATCH 11/17] vrfs1008: integration bug fixing --- web/app/assets/javascripts/inviteMusicians.js | 28 +++++-------- web/app/assets/javascripts/session.js | 2 +- .../controllers/api_invitations_controller.rb | 42 +++++++++++-------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 74e767f73..10226ff6b 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -9,21 +9,16 @@ var userIds = []; var userPhotoUrls = []; var friendSelectorDialog = null; - var _friendSelectorHTML = null; var selectedFriendIds = {}; var autoComplete = null; var rest = context.JK.Rest(); - var selectedIds = {}; - var newSelections = {}; var mySaveCallback; this.clearSelections = function() { userNames = []; userIds = []; userPhotoUrls = []; - selectedIds = {}; selectedFriendIds = {}; - newSelections = {}; $('.selected-friends').empty(); }; @@ -148,19 +143,19 @@ } function events() { - if ($('.btn-choose-friends').data('events') === undefined) { + //if ($('.btn-choose-friends').data('events') === undefined) { $('.selected-friends').on("click", ".invitation a", removeInvitation); $('.btn-choose-friends').click(function(){ friendSelectorDialog.showDialog(selectedFriendIds); }); - } + //} } - function showDialog(sessionId) { + this.inviteJoinSession = function(sessionId) { if (0 == $('#join-session-invite-musicians .friendbox').length) { this.appendFriendSelector($('#join-session-invite-musicians')); } - selectedFriendIds = {}; + this.clearSelections(); $.ajax({ ajax: false, url: "/api/invitations", @@ -170,21 +165,19 @@ } }).done(function(response) { response.map(function(item) { - selectedFriendIds[item['receiver']['id']] = true; + var dd = item['receiver'] + selectedFriendIds[dd['id']] = true; + addInvitation(dd['name'], dd['id']); }); - logger.debug(selectedFriendIds); }).fail(app.ajaxError); } - this.friendSelectorHTML = function() { - if (_friendSelectorHTML === null) { - _friendSelectorHTML = context.JK.fillTemplate($('#template-session-invite-musicians').html(),{}); - } - return _friendSelectorHTML; + function friendSelectorHTML() { + return context.JK.fillTemplate($('#template-session-invite-musicians').html(),{}); } this.appendFriendSelector = function(elem) { - elem.append(this.friendSelectorHTML()); + elem.append(friendSelectorHTML()); events(); }; @@ -199,7 +192,6 @@ this.searchFriends = searchFriends; this.addInvitation = addInvitation; - this.showDialog = showDialog; return this; }; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index ba21b7340..0b253d8bd 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1305,7 +1305,7 @@ } function inviteMusicians() { - inviteMusiciansDialog.showDialog(sessionId); + inviteMusiciansDialog.inviteJoinSession(sessionId); } function events() { diff --git a/web/app/controllers/api_invitations_controller.rb b/web/app/controllers/api_invitations_controller.rb index 1de124bec..ac487c8a9 100644 --- a/web/app/controllers/api_invitations_controller.rb +++ b/web/app/controllers/api_invitations_controller.rb @@ -37,25 +37,33 @@ class ApiInvitationsController < ApiController sender = current_user join_request = JoinRequest.find(params[:join_request]) unless params[:join_request].nil? - @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) + @invitation = Invitation.limit(1) + .where(:receiver_id => params[:receiver], + :sender_id => current_user.id, + :music_session_id => params[:music_session]) + .first + if @invitation 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 + @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 end end From 28d346fe23d03b00432bcf4ddaa4fc6d5f9074f6 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 00:02:54 -0600 Subject: [PATCH 12/17] vrfs1008: refactoring, cleanup, bug fixes --- web/app/assets/javascripts/createSession.js | 2 +- web/app/assets/javascripts/inviteMusicians.js | 76 ++++++++++--------- web/app/assets/javascripts/session.js | 2 +- web/app/views/clients/_createSession.html.erb | 7 -- ...ans.html.erb => _inviteMusicians.html.erb} | 13 +++- web/app/views/clients/index.html.erb | 2 +- 6 files changed, 55 insertions(+), 47 deletions(-) rename web/app/views/clients/{_inviteSessionMusicians.html.erb => _inviteMusicians.html.erb} (63%) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index b5c7808bf..4f8026dc0 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -277,7 +277,7 @@ function initialize(invitationDialogInstance, inviteMusiciansDialogInstance) { invitationDialog = invitationDialogInstance; inviteMusiciansDialog = inviteMusiciansDialogInstance; - inviteMusiciansDialog.appendFriendSelector($('#create-session-invite-musicians')); + inviteMusiciansDialog.inviteSessionCreate('#create-session-invite-musicians'); events(); loadBands(); loadSessionSettings(); diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 10226ff6b..fa26c0429 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -13,6 +13,31 @@ var autoComplete = null; var rest = context.JK.Rest(); var mySaveCallback; + var inviteAction = 'create'; // create/update + + this.inviteSessionCreate = function(elemSelector) { + inviteAction = 'create'; + _appendFriendSelector($(elemSelector)); + }; + + this.inviteSessionUpdate = function(elemSelector, sessionId) { + inviteAction = 'update'; + if (0 == $(elemSelector + ' .friendbox').length) { + _appendFriendSelector($(elemSelector)); + } + this.clearSelections(); + $.ajax({ + ajax: false, + url: "/api/invitations", + data: { session_id: sessionId, sender: context.JK.currentUserId } + }).done(function(response) { + response.map(function(item) { + var dd = item['receiver'] + selectedFriendIds[dd['id']] = true; + addInvitation(dd['name'], dd['id']); + }); + }).fail(app.ajaxError); + } this.clearSelections = function() { userNames = []; @@ -65,7 +90,11 @@ function addInvitation(value, data) { if ($('.selected-friends div[user-id=' + data + ']').length === 0) { var template = $('#template-added-invitation').html(); - var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); + var image_style = inviteAction == 'update' ? 'display:none' : ''; + var invitationHtml = context.JK.fillTemplate(template, + {userId: data, + userName: value, + image_style: image_style}); $('.selected-friends').append(invitationHtml); $('#friend-input').select(); selectedFriendIds[data] = true; @@ -142,43 +171,22 @@ }); } - function events() { - //if ($('.btn-choose-friends').data('events') === undefined) { - $('.selected-friends').on("click", ".invitation a", removeInvitation); - $('.btn-choose-friends').click(function(){ - friendSelectorDialog.showDialog(selectedFriendIds); - }); - //} + function _events() { + $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); + $('#btn-choose-friends-'+inviteAction).click(function(){ + friendSelectorDialog.showDialog(selectedFriendIds); + }); } - this.inviteJoinSession = function(sessionId) { - if (0 == $('#join-session-invite-musicians .friendbox').length) { - this.appendFriendSelector($('#join-session-invite-musicians')); - } - this.clearSelections(); - $.ajax({ - ajax: false, - url: "/api/invitations", - data: { - session_id: sessionId, - sender: context.JK.currentUserId - } - }).done(function(response) { - response.map(function(item) { - var dd = item['receiver'] - selectedFriendIds[dd['id']] = true; - addInvitation(dd['name'], dd['id']); - }); - }).fail(app.ajaxError); + function _friendSelectorHTML() { + return context.JK.fillTemplate($('#template-session-invite-musicians').html(), + {choose_friends_id: 'btn-choose-friends-'+inviteAction, + selected_friends_id: 'selected-friends-'+inviteAction}); } - function friendSelectorHTML() { - return context.JK.fillTemplate($('#template-session-invite-musicians').html(),{}); - } - - this.appendFriendSelector = function(elem) { - elem.append(friendSelectorHTML()); - events(); + function _appendFriendSelector(elemSelector) { + elemSelector.append(_friendSelectorHTML()); + _events(); }; this.initialize = function(friendSelectorDialogInstance) { diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 0b253d8bd..569b011f9 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1305,7 +1305,7 @@ } function inviteMusicians() { - inviteMusiciansDialog.inviteJoinSession(sessionId); + inviteMusiciansDialog.inviteSessionUpdate('#update-session-invite-musicians', sessionId); } function events() { diff --git a/web/app/views/clients/_createSession.html.erb b/web/app/views/clients/_createSession.html.erb index 56e5304a4..7a0b3f565 100644 --- a/web/app/views/clients/_createSession.html.erb +++ b/web/app/views/clients/_createSession.html.erb @@ -156,13 +156,6 @@
- - - + + + diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index 42586fd45..d19151888 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -35,7 +35,7 @@ <%= render "account_profile_avatar" %> <%= render "account_audio_profile" %> <%= render "invitationDialog" %> -<%= render "inviteSessionMusicians" %> +<%= render "inviteMusicians" %> <%= render "whatsNextDialog" %> <%= render "recordingFinishedDialog" %> <%= render "localRecordingsDialog" %> From cfeed312bf2ed5887299c5f264d26f20deb30ae7 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 00:12:00 -0600 Subject: [PATCH 13/17] vrfs1008: refactoring --- web/app/assets/javascripts/createSession.js | 14 +++++++------- web/app/assets/javascripts/inviteMusicians.js | 6 +++--- web/app/assets/javascripts/session.js | 8 ++++---- web/app/views/clients/_inviteMusicians.html.erb | 2 +- web/app/views/clients/index.html.erb | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/web/app/assets/javascripts/createSession.js b/web/app/assets/javascripts/createSession.js index 4f8026dc0..ae3e5ff92 100644 --- a/web/app/assets/javascripts/createSession.js +++ b/web/app/assets/javascripts/createSession.js @@ -8,18 +8,18 @@ var rest = context.JK.Rest(); var realtimeMessaging = context.JK.JamServer; var invitationDialog = null; - var inviteMusiciansDialog = null; + var inviteMusiciansUtil = null; var MAX_GENRES = 1; var sessionSettings = {}; function beforeShow(data) { - inviteMusiciansDialog.clearSelections(); + inviteMusiciansUtil.clearSelections(); context.JK.GenreSelectorHelper.render('#create-session-genre'); resetForm(); } function afterShow(data) { - inviteMusiciansDialog.loadFriends(); + inviteMusiciansUtil.loadFriends(); } function resetForm() { @@ -164,7 +164,7 @@ data: jsonData, success: function(response) { var newSessionId = response.id; - var invitationCount = inviteMusiciansDialog.createInvitations(newSessionId, function() { + var invitationCount = inviteMusiciansUtil.createInvitations(newSessionId, function() { context.location = '#/session/' + newSessionId; }); // Re-loading the session settings will cause the form to reset with the right stuff in it. @@ -274,10 +274,10 @@ }); } - function initialize(invitationDialogInstance, inviteMusiciansDialogInstance) { + function initialize(invitationDialogInstance, inviteMusiciansUtilInstance) { invitationDialog = invitationDialogInstance; - inviteMusiciansDialog = inviteMusiciansDialogInstance; - inviteMusiciansDialog.inviteSessionCreate('#create-session-invite-musicians'); + inviteMusiciansUtil = inviteMusiciansUtilInstance; + inviteMusiciansUtil.inviteSessionCreate('#create-session-invite-musicians'); events(); loadBands(); loadSessionSettings(); diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index fa26c0429..98213fb16 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -3,7 +3,7 @@ "use strict"; context.JK = context.JK || {}; - context.JK.InviteMusiciansDialog = function(app) { + context.JK.InviteMusiciansUtil = function(app) { var logger = context.JK.logger; var userNames = []; var userIds = []; @@ -90,11 +90,11 @@ function addInvitation(value, data) { if ($('.selected-friends div[user-id=' + data + ']').length === 0) { var template = $('#template-added-invitation').html(); - var image_style = inviteAction == 'update' ? 'display:none' : ''; + var imgStyle = inviteAction == 'update' ? 'display:none' : ''; var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value, - image_style: image_style}); + imageStyle: imgStyle}); $('.selected-friends').append(invitationHtml); $('#friend-input').select(); selectedFriendIds[data] = true; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 569b011f9..e017d1de6 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -15,7 +15,7 @@ var localRecordingsDialog = null; var recordingFinishedDialog = null; var friendSelectorDialog = null; - var inviteMusiciansDialog = null; + var inviteMusiciansUtil = null; var screenActive = false; var currentMixerRangeMin = null; var currentMixerRangeMax = null; @@ -1305,7 +1305,7 @@ } function inviteMusicians() { - inviteMusiciansDialog.inviteSessionUpdate('#update-session-invite-musicians', sessionId); + inviteMusiciansUtil.inviteSessionUpdate('#update-session-invite-musicians', sessionId); } function events() { @@ -1326,10 +1326,10 @@ .on('change-position', onChangePlayPosition); } - this.initialize = function(localRecordingsDialogInstance, recordingFinishedDialogInstance, inviteMusiciansDialogInstance) { + this.initialize = function(localRecordingsDialogInstance, recordingFinishedDialogInstance, inviteMusiciansUtilInstance) { localRecordingsDialog = localRecordingsDialogInstance; recordingFinishedDialog = recordingFinishedDialogInstance; - inviteMusiciansDialog = inviteMusiciansDialogInstance; + inviteMusiciansUtil = inviteMusiciansUtilInstance; context.jamClient.SetVURefreshRate(150); playbackControls = new context.JK.PlaybackControls($('.session-recordings .recording-controls')); events(); diff --git a/web/app/views/clients/_inviteMusicians.html.erb b/web/app/views/clients/_inviteMusicians.html.erb index 3148e5daa..09999942c 100644 --- a/web/app/views/clients/_inviteMusicians.html.erb +++ b/web/app/views/clients/_inviteMusicians.html.erb @@ -33,6 +33,6 @@ diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index d19151888..0f0e47fb3 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -106,8 +106,8 @@ var friendSelectorDialog = new JK.FriendSelectorDialog(JK.app); friendSelectorDialog.initialize(); - var inviteMusiciansDialog = new JK.InviteMusiciansDialog(JK.app); - inviteMusiciansDialog.initialize(friendSelectorDialog); + var inviteMusiciansUtil = new JK.InviteMusiciansUtil(JK.app); + inviteMusiciansUtil.initialize(friendSelectorDialog); var userDropdown = new JK.UserDropdown(JK.app); JK.UserDropdown = userDropdown; @@ -152,7 +152,7 @@ JK.Banner.initialize(); var createSessionScreen = new JK.CreateSessionScreen(JK.app); - createSessionScreen.initialize(invitationDialog, inviteMusiciansDialog); + createSessionScreen.initialize(invitationDialog, inviteMusiciansUtil); var bandSetupScreen = new JK.BandSetupScreen(JK.app); bandSetupScreen.initialize(invitationDialog, friendSelectorDialog); @@ -174,7 +174,7 @@ findBandScreen.initialize(); var sessionScreen = new JK.SessionScreen(JK.app); - sessionScreen.initialize(localRecordingsDialog, recordingFinishedDialog, inviteMusiciansDialog); + sessionScreen.initialize(localRecordingsDialog, recordingFinishedDialog, inviteMusiciansUtil); var sessionSettingsDialog = new JK.SessionSettingsDialog(JK.app, sessionScreen); sessionSettingsDialog.initialize(); From 61a7dcd50f47fd40c8ac8d34dadbf6b6bd70eeaf Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 01:01:37 -0600 Subject: [PATCH 14/17] vrfs1008: added existingInvites storage for updates --- web/app/assets/javascripts/inviteMusicians.js | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 98213fb16..1e8e29fb7 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -10,9 +10,9 @@ var userPhotoUrls = []; var friendSelectorDialog = null; var selectedFriendIds = {}; + var existingInvites = []; var autoComplete = null; var rest = context.JK.Rest(); - var mySaveCallback; var inviteAction = 'create'; // create/update this.inviteSessionCreate = function(elemSelector) { @@ -21,6 +21,7 @@ }; this.inviteSessionUpdate = function(elemSelector, sessionId) { + friendSelectorDialog.setCallback(friendSelectorCallback); inviteAction = 'update'; if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); @@ -32,9 +33,9 @@ data: { session_id: sessionId, sender: context.JK.currentUserId } }).done(function(response) { response.map(function(item) { - var dd = item['receiver'] - selectedFriendIds[dd['id']] = true; - addInvitation(dd['name'], dd['id']); + var dd = item['receiver']; + existingInvites.push(dd.id); + addInvitation(dd.name, dd.id); }); }).fail(app.ajaxError); } @@ -44,6 +45,7 @@ userIds = []; userPhotoUrls = []; selectedFriendIds = {}; + existingInvites = []; $('.selected-friends').empty(); }; @@ -83,14 +85,19 @@ function friendSelectorCallback(newSelections) { var keys = Object.keys(newSelections); for (var i=0; i < keys.length; i++) { - addInvitation(newSelections[keys[i]].userName, newSelections[keys[i]].userId); + var dd = newSelections[keys[i]]; + addInvitation(dd.userName, dd.userId); } } + function _inviteExists(userID) { + return 0 <= existingInvites.indexOf(userID); + } + function addInvitation(value, data) { if ($('.selected-friends div[user-id=' + data + ']').length === 0) { var template = $('#template-added-invitation').html(); - var imgStyle = inviteAction == 'update' ? 'display:none' : ''; + var imgStyle = _inviteExists(data) ? 'display:none' : ''; var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value, @@ -98,36 +105,39 @@ $('.selected-friends').append(invitationHtml); $('#friend-input').select(); selectedFriendIds[data] = true; - } - else { + + } else { $('#friend-input').select(); context.alert('Invitation already exists for this musician.'); } } function removeInvitation(evt) { - delete selectedFriendIds[$(evt.currentTarget).parent().attr('user-id')]; + var dd = $(evt.currentTarget).parent().attr('user-id'); + delete selectedFriendIds[dd]; $(evt.currentTarget).closest('.invitation').remove(); } this.createInvitations = function(sessionId, onComplete) { var callCount = 0; - var totalInvitations = 0; + var totalInvitations = existingInvites.length; $('.selected-friends .invitation').each(function(index, invitation) { - callCount++; - totalInvitations++; var invite_id = $(invitation).attr('user-id'); - var invite = { - music_session: sessionId, - receiver: invite_id - }; - $.ajax({ - type: "POST", - url: "/api/invitations", - data: invite - }).done(function(response) { - callCount--; - }).fail(app.ajaxError); + if (!_inviteExists(invite_id)) { + callCount++; + totalInvitations++; + var invite = { + music_session: sessionId, + receiver: invite_id + }; + $.ajax({ + type: "POST", + url: "/api/invitations", + data: invite + }).done(function(response) { + callCount--; + }).fail(app.ajaxError); + } }); // TODO - this is the second time I've used this pattern. // refactor to make a common utility for this. @@ -171,13 +181,6 @@ }); } - function _events() { - $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); - $('#btn-choose-friends-'+inviteAction).click(function(){ - friendSelectorDialog.showDialog(selectedFriendIds); - }); - } - function _friendSelectorHTML() { return context.JK.fillTemplate($('#template-session-invite-musicians').html(), {choose_friends_id: 'btn-choose-friends-'+inviteAction, @@ -186,20 +189,16 @@ function _appendFriendSelector(elemSelector) { elemSelector.append(_friendSelectorHTML()); - _events(); + $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); + $('#btn-choose-friends-'+inviteAction).click(function(){ + friendSelectorDialog.showDialog(selectedFriendIds); + }); }; this.initialize = function(friendSelectorDialogInstance) { friendSelectorDialog = friendSelectorDialogInstance; }; - this.setCallback = function(callback) { - mySaveCallback = callback; - } - - this.searchFriends = searchFriends; - this.addInvitation = addInvitation; - return this; }; From 3c6af2e028e574eed8cc1c5554a18085ea8ba4b3 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 01:31:20 -0600 Subject: [PATCH 15/17] vrfs1008: sending updated invites --- web/app/assets/javascripts/inviteMusicians.js | 18 +++++++++++------- .../views/clients/_inviteMusicians.html.erb | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 1e8e29fb7..8bd750bce 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -9,7 +9,7 @@ var userIds = []; var userPhotoUrls = []; var friendSelectorDialog = null; - var selectedFriendIds = {}; + var invitedFriends = {}; var existingInvites = []; var autoComplete = null; var rest = context.JK.Rest(); @@ -25,6 +25,9 @@ inviteAction = 'update'; if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); + $('#btn-save-invites').click(function() { + createInvitations(sessionId); + }); } this.clearSelections(); $.ajax({ @@ -44,7 +47,7 @@ userNames = []; userIds = []; userPhotoUrls = []; - selectedFriendIds = {}; + invitedFriends = {}; existingInvites = []; $('.selected-friends').empty(); }; @@ -104,7 +107,7 @@ imageStyle: imgStyle}); $('.selected-friends').append(invitationHtml); $('#friend-input').select(); - selectedFriendIds[data] = true; + invitedFriends[data] = true; } else { $('#friend-input').select(); @@ -114,11 +117,11 @@ function removeInvitation(evt) { var dd = $(evt.currentTarget).parent().attr('user-id'); - delete selectedFriendIds[dd]; + delete invitedFriends[dd]; $(evt.currentTarget).closest('.invitation').remove(); } - this.createInvitations = function(sessionId, onComplete) { + function createInvitations(sessionId, onComplete) { var callCount = 0; var totalInvitations = existingInvites.length; $('.selected-friends .invitation').each(function(index, invitation) { @@ -148,9 +151,10 @@ context.setTimeout(checker, 10); } } - checker(); + if (onComplete) checker(); return totalInvitations; } + this.createInvitations = createInvitations; function searchFriends(query) { if (query.length < 2) { @@ -191,7 +195,7 @@ elemSelector.append(_friendSelectorHTML()); $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); $('#btn-choose-friends-'+inviteAction).click(function(){ - friendSelectorDialog.showDialog(selectedFriendIds); + friendSelectorDialog.showDialog(invitedFriends); }); }; diff --git a/web/app/views/clients/_inviteMusicians.html.erb b/web/app/views/clients/_inviteMusicians.html.erb index 09999942c..b80f76f5d 100644 --- a/web/app/views/clients/_inviteMusicians.html.erb +++ b/web/app/views/clients/_inviteMusicians.html.erb @@ -1,4 +1,4 @@ - +
From ea6391e46e2a368a51908e336aa980dc1a173bf0 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 01:52:22 -0600 Subject: [PATCH 16/17] vrfs1008: styled the invite dialog box; fixed bug updating invites --- web/app/assets/javascripts/inviteMusicians.js | 3 ++- web/app/assets/stylesheets/client/content.css.scss | 1 - web/app/assets/stylesheets/client/session.css.scss | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 8bd750bce..802fc5839 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -23,10 +23,11 @@ this.inviteSessionUpdate = function(elemSelector, sessionId) { friendSelectorDialog.setCallback(friendSelectorCallback); inviteAction = 'update'; + var sid = sessionId; if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); $('#btn-save-invites').click(function() { - createInvitations(sessionId); + createInvitations(sid); }); } this.clearSelections(); diff --git a/web/app/assets/stylesheets/client/content.css.scss b/web/app/assets/stylesheets/client/content.css.scss index 88550ab29..1f96cb299 100644 --- a/web/app/assets/stylesheets/client/content.css.scss +++ b/web/app/assets/stylesheets/client/content.css.scss @@ -204,7 +204,6 @@ .friendbox { padding:5px; - width:100%; height:60px; } diff --git a/web/app/assets/stylesheets/client/session.css.scss b/web/app/assets/stylesheets/client/session.css.scss index ad415a5da..fc455d55a 100644 --- a/web/app/assets/stylesheets/client/session.css.scss +++ b/web/app/assets/stylesheets/client/session.css.scss @@ -716,3 +716,6 @@ table.vu td { } +#update-session-invite-musicians { + margin: 10px; +} \ No newline at end of file From 91007055a0e0de518f35dfdfe496fae3bc6c89c7 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 14 Jan 2014 02:29:07 -0600 Subject: [PATCH 17/17] vrfs1008: fixed updating invites bug --- web/app/assets/javascripts/inviteMusicians.js | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 802fc5839..95f5f58cb 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -9,11 +9,12 @@ var userIds = []; var userPhotoUrls = []; var friendSelectorDialog = null; - var invitedFriends = {}; + var invitedFriends = []; var existingInvites = []; var autoComplete = null; var rest = context.JK.Rest(); var inviteAction = 'create'; // create/update + var updateSessionID = null; this.inviteSessionCreate = function(elemSelector) { inviteAction = 'create'; @@ -21,16 +22,16 @@ }; this.inviteSessionUpdate = function(elemSelector, sessionId) { + this.clearSelections(); + updateSessionID = sessionId; friendSelectorDialog.setCallback(friendSelectorCallback); inviteAction = 'update'; - var sid = sessionId; if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); $('#btn-save-invites').click(function() { - createInvitations(sid); + createInvitations(updateSessionID); }); } - this.clearSelections(); $.ajax({ ajax: false, url: "/api/invitations", @@ -48,8 +49,9 @@ userNames = []; userIds = []; userPhotoUrls = []; - invitedFriends = {}; + invitedFriends = []; existingInvites = []; + updateSessionID = null; $('.selected-friends').empty(); }; @@ -99,7 +101,7 @@ } function addInvitation(value, data) { - if ($('.selected-friends div[user-id=' + data + ']').length === 0) { + if (0 > invitedFriends.indexOf(data)) { var template = $('#template-added-invitation').html(); var imgStyle = _inviteExists(data) ? 'display:none' : ''; var invitationHtml = context.JK.fillTemplate(template, @@ -108,7 +110,7 @@ imageStyle: imgStyle}); $('.selected-friends').append(invitationHtml); $('#friend-input').select(); - invitedFriends[data] = true; + invitedFriends.push(data); } else { $('#friend-input').select(); @@ -117,19 +119,17 @@ } function removeInvitation(evt) { - var dd = $(evt.currentTarget).parent().attr('user-id'); - delete invitedFriends[dd]; + var idx = invitedFriends.indexOf($(evt.currentTarget).parent().attr('user-id')); + if (0 <= idx) invitedFriends.splice(idx, 1); $(evt.currentTarget).closest('.invitation').remove(); } function createInvitations(sessionId, onComplete) { var callCount = 0; - var totalInvitations = existingInvites.length; - $('.selected-friends .invitation').each(function(index, invitation) { - var invite_id = $(invitation).attr('user-id'); + var totalInvitations = invitedFriends.length - existingInvites.length; + invitedFriends.map(function(invite_id) { if (!_inviteExists(invite_id)) { callCount++; - totalInvitations++; var invite = { music_session: sessionId, receiver: invite_id @@ -146,11 +146,7 @@ // TODO - this is the second time I've used this pattern. // refactor to make a common utility for this. function checker() { - if (callCount === 0) { - onComplete(); - } else { - context.setTimeout(checker, 10); - } + callCount === 0 ? onComplete() : context.setTimeout(checker, 10); } if (onComplete) checker(); return totalInvitations; @@ -196,7 +192,9 @@ elemSelector.append(_friendSelectorHTML()); $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); $('#btn-choose-friends-'+inviteAction).click(function(){ - friendSelectorDialog.showDialog(invitedFriends); + var obj = {}; + invitedFriends.map(function(uid) { obj[uid] = true; }); + friendSelectorDialog.showDialog(obj); }); };