From f53c5c9612424eaf72c92d9490d0b835bddb3afe Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 26 Jan 2015 21:22:44 -0600 Subject: [PATCH] *wip --- build | 2 +- .../javascripts/dialog/openJamTrackDialog.js | 15 +-- .../javascripts/download_jamtrack.js.coffee | 9 +- web/app/assets/javascripts/fakeJamClient.js | 4 + web/app/assets/javascripts/session.js | 94 +++++++++++++++---- web/app/assets/stylesheets/client/client.css | 1 + .../client/downloadJamTrack.css.scss | 4 + .../stylesheets/client/session.css.scss | 4 + .../views/api_jam_tracks/show_for_client.rabl | 4 + .../_download_jamtrack_templates.html.slim | 5 +- web/lib/tasks/sample_data.rake | 2 +- .../api_jam_tracks_controller_spec.rb | 1 + 12 files changed, 107 insertions(+), 38 deletions(-) diff --git a/build b/build index 6d408c180..db8ab33a4 100755 --- a/build +++ b/build @@ -66,7 +66,7 @@ DEB_SERVER=http://localhost:9010/apt-`uname -p` GEM_SERVER=http://localhost:9000/gems # if still going, then push all debs up - if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* || "$GIT_BRANCH" == *release* ]]; then + if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* || "$GIT_BRANCH" == *release* || "$GIT_BRANCH" == *feature* || "$GIT_BRANCH" == *hotfix* ]]; then echo "" echo "PUSHING DB ARTIFACTS" diff --git a/web/app/assets/javascripts/dialog/openJamTrackDialog.js b/web/app/assets/javascripts/dialog/openJamTrackDialog.js index 522b1a5e6..0c6d2e712 100644 --- a/web/app/assets/javascripts/dialog/openJamTrackDialog.js +++ b/web/app/assets/javascripts/dialog/openJamTrackDialog.js @@ -77,19 +77,8 @@ // tell the server we are about to start a recording rest.openJamTrack({id: context.JK.CurrentSessionModel.id(), jam_track_id: jamTrack.id}) .done(function(response) { - - context.jamClient.JamTrackStopPlay(); - var result = context.jamClient.JamTrackPlay(jamTrack.id); - - logger.debug("JamTrackPlay response: %o", result); - - if(result) { - app.layout.closeDialog('open-jam-track-dialog'); - } - else { - logger.error("unable to open jam track") - } - + $dialog.data('result', {success:true, jamTrack: jamTrack}) + app.layout.closeDialog('open-jam-track-dialog'); }) .fail(function(jqXHR) { app.notifyServerError(jqXHR, "Unable to Open JamTrack For Playback"); diff --git a/web/app/assets/javascripts/download_jamtrack.js.coffee b/web/app/assets/javascripts/download_jamtrack.js.coffee index f42ed5793..ff9669530 100644 --- a/web/app/assets/javascripts/download_jamtrack.js.coffee +++ b/web/app/assets/javascripts/download_jamtrack.js.coffee @@ -58,7 +58,10 @@ context.JK.DownloadJamTrack = class DownloadJamTrack } context.JK.DownloadJamTracks[@jamTrackId] = this + downloadJamTrackTemplate = $('#template-download-jamtrack') + throw "no download jamtrack template" if not downloadJamTrackTemplate.exists() + @root = $(downloadJamTrackTemplate.html()) # after you've created the DownloadJamTrack widget, call synchronize which will begin ensuring that the jamtrack # is downloaded and ready to open @@ -66,10 +69,8 @@ context.JK.DownloadJamTrack = class DownloadJamTrack @active = true this.reset() - downloadJamTrackTemplate = $('#template-download-jamtrack') - throw "no download jamtrack template" if not downloadJamTrackTemplate.exists() - @root = $(downloadJamTrackTemplate.html()) + @root.on('remove', this.destroy) # automatically destroy self when removed from DOM @stateHolder = @root.find('.state') # populate in template and visual transition functions @@ -281,7 +282,7 @@ context.JK.DownloadJamTrack = class DownloadJamTrack @state.show() - $(this).triggerHandler(@EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, {state: @state.name}) + $(this).triggerHandler(@EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, {state: @state}) checkState: () => # check for the success state against the local state of the client... if it's playable, then we should be OK diff --git a/web/app/assets/javascripts/fakeJamClient.js b/web/app/assets/javascripts/fakeJamClient.js index cd3776d8a..37a0b65e6 100644 --- a/web/app/assets/javascripts/fakeJamClient.js +++ b/web/app/assets/javascripts/fakeJamClient.js @@ -679,6 +679,8 @@ function TrackSetInstrument(track, instrumentId) {} + function JamTrackStopPlay() {} + function JamTrackPlay(){return true; } function JamTrackIsPlayable() { return true; } @@ -981,6 +983,8 @@ this.TrackGetChatUsesMusic = TrackGetChatUsesMusic; this.TrackSetChatUsesMusic = TrackSetChatUsesMusic; + this.JamTrackStopPlay = JamTrackStopPlay; + this.JamTrackPlay = JamTrackPlay; this.JamTrackIsPlayable = JamTrackIsPlayable; this.JamTrackGetTrackDetail = JamTrackGetTrackDetail; this.JamTrackKeysRequest = JamTrackKeysRequest; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 96d1dc55a..d5a6e0c31 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -47,6 +47,10 @@ var $screen = null; var $mixModeDropdown = null; var $templateMixerModeChange = null; + var $otherAudioContainer = null; + var $myTracksContainer = null; + var $liveTracksContainer = null; + var downloadJamTrack = null; var rest = context.JK.Rest(); var RENDER_SESSION_DELAY = 750; // When I need to render a session, I have to wait a bit for the mixers to be there. @@ -98,7 +102,7 @@ window.location = '/client#/home'; } promptLeave = true; - $('#session-mytracks-container').empty(); + $myTracksContainer.empty(); displayDoneRecording(); // assumption is that you can't join a recording session, so this should be safe var shareDialog = new JK.ShareDialog(context.JK.app, sessionId, "session"); @@ -500,7 +504,7 @@ } function renderSession() { - $('#session-mytracks-container').empty(); + $myTracksContainer.empty(); $('.session-track').remove(); // Remove previous tracks var $voiceChat = $('#voice-chat'); $voiceChat.hide(); @@ -514,7 +518,7 @@ if ($('.session-livetracks .track').length === 0) { $('.session-livetracks .when-empty').show(); } - if ($('.session-recordings .track').length === 0) { + if ($('.session-recordings .track').length === 0 && $('.session-recordings .download-jamtrack').length === 0) { $('.session-recordings .when-empty').show(); $('.session-recording-name-wrapper').hide(); $('.session-recordings .recording-controls').hide(); @@ -884,7 +888,7 @@ } function renderJamTracks(jamTrackMixers) { - log.debug("rendering jam tracks") + logger.debug("rendering jam tracks") var jamTracks = sessionModel.jamTracks(); // pluck the 1st mixer, and assume that all other mixers in this group are of the same type (between JamTrack vs Peer) @@ -1433,11 +1437,9 @@ function _addTrack(allowDelete, trackData, mixer, oppositeMixer) { - var parentSelector = '#session-mytracks-container'; - var $destination = $(parentSelector); + var $destination = $myTracksContainer; if (trackData.clientId !== app.clientId) { - parentSelector = '#session-livetracks-container'; - $destination = $(parentSelector); + $destination = $liveTracksContainer $('.session-livetracks .when-empty').hide(); } var template = $('#template-session-track').html(); @@ -1451,7 +1453,7 @@ $destination.append(newTrack); // Render VU meters and gain fader - var trackSelector = parentSelector + ' .session-track[track-id="' + trackData.trackId + '"]'; + var trackSelector = $destination.selector + ' .session-track[track-id="' + trackData.trackId + '"]'; var gainPercent = trackData.gainPercent || 0; connectTrackToMixer(trackSelector, trackData, trackData.mixerId, gainPercent, trackData.group_id); @@ -1467,24 +1469,27 @@ tracks[trackData.trackId] = new context.JK.SessionTrack(trackData.clientId); } - + // something is being shown now in the other audio area + function otherAudioFilled() { + $('.session-recordings .when-empty').hide(); + $('.session-recording-name-wrapper').show(); + } function _addRecordingTrack(trackData) { - var parentSelector = '#session-recordedtracks-container'; - var $destination = $(parentSelector); - $('.session-recordings .when-empty').hide(); - $('.session-recording-name-wrapper').show(); + + otherAudioFilled(); + $('.session-recordings .recording-controls').show(); var template = $('#template-session-track').html(); var newTrack = $(context.JK.fillTemplate(template, trackData)); - $destination.append(newTrack); + $otherAudioContainer.append(newTrack); if(trackData.preMasteredClass) { context.JK.helpBubble($('.track-instrument', newTrack), 'pre-processed-track', {}, {offsetParent: newTrack.closest('.content-body')}); } // Render VU meters and gain fader - var trackSelector = parentSelector + ' .session-track[track-id="' + trackData.trackId + '"]'; + var trackSelector = $otherAudioContainer.selector + ' .session-track[track-id="' + trackData.trackId + '"]'; var gainPercent = trackData.gainPercent || 0; var $track = connectTrackToMixer(trackSelector, trackData, trackData.mixerId, gainPercent, null); var $trackIconMute = $track.find('.track-icon-mute') @@ -1921,7 +1926,59 @@ return false; } - app.layout.showDialog('open-jam-track-dialog'); + app.layout.showDialog('open-jam-track-dialog').one(EVENTS.DIALOG_CLOSED, function(e, data) { + + // once the dialog is closed, see if the user has a jamtrack selected + if(!data.canceled && data.result.jamTrack) { + + var jamTrack = data.result.jamTrack; + + logger.debug("JamTrack INFO", jamTrack.id, jamTrack.jam_track_right_id) + + // hide 'other audio' placeholder + otherAudioFilled(); + + if(downloadJamTrack) { + // if there was one showing before somehow, destroy it. + logger.warn("destroying existing JamTrack") + downloadJamTrack.root.remove(); + downloadJamTrack.destroy(); + downloadJamTrack = null + } + + downloadJamTrack = new context.JK.DownloadJamTrack(app, jamTrack.id, jamTrack.jam_track_right_id); + + // the widget indicates when it gets to any transition; we can hide it once it reaches completion + $(downloadJamTrack).on(EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, function(e, data) { + + if(data.state == downloadJamTrack.states.synchronized) { + logger.debug("jamtrack synchronized; hide widget and show tracks") + downloadJamTrack.root.remove(); + downloadJamTrack.destroy(); + downloadJamTrack = null; + + context.jamClient.JamTrackStopPlay(); + var result = context.jamClient.JamTrackPlay(jamTrack.id); + + if(!result) { + app.notify( + { title: "JamTrack Can Not Open", + text: "Unable to open your JamTrack. Please contact support@jamkazam.com" + }, null, true); + } + } + }) + + // show it on the page + $otherAudioContainer.append(downloadJamTrack.root) + + // kick off the download jamtrack process + downloadJamTrack.init() + } + else { + logger.debug("OpenJamTrack dialog closed with no selection; ignoring", data) + } + }) return false; } @@ -2093,6 +2150,9 @@ $screen = $('#session-screen'); $mixModeDropdown = $screen.find('select.monitor-mode') $templateMixerModeChange = $('#template-mixer-mode-change'); + $otherAudioContainer = $('#session-recordedtracks-container'); + $myTracksContainer = $('#session-mytracks-container') + $liveTracksContainer = $('#session-livetracks-container'); events(); diff --git a/web/app/assets/stylesheets/client/client.css b/web/app/assets/stylesheets/client/client.css index 8403cf75a..9e1899ce3 100644 --- a/web/app/assets/stylesheets/client/client.css +++ b/web/app/assets/stylesheets/client/client.css @@ -66,4 +66,5 @@ *= require jquery.Jcrop *= require icheck/minimal/minimal *= require users/syncViewer + *= require ./downloadJamTrack */ \ No newline at end of file diff --git a/web/app/assets/stylesheets/client/downloadJamTrack.css.scss b/web/app/assets/stylesheets/client/downloadJamTrack.css.scss index 97313ab65..762a4103b 100644 --- a/web/app/assets/stylesheets/client/downloadJamTrack.css.scss +++ b/web/app/assets/stylesheets/client/downloadJamTrack.css.scss @@ -14,6 +14,10 @@ margin-top:10px; } + .msg { + white-space: normal; + } + .spinner-large { margin:20px auto 0; text-align:center; diff --git a/web/app/assets/stylesheets/client/session.css.scss b/web/app/assets/stylesheets/client/session.css.scss index 8c37af233..53cbfd929 100644 --- a/web/app/assets/stylesheets/client/session.css.scss +++ b/web/app/assets/stylesheets/client/session.css.scss @@ -133,6 +133,10 @@ margin-bottom:8px; font-size:16px; } + + .download-jamtrack { + margin-top:50px; + } } diff --git a/web/app/views/api_jam_tracks/show_for_client.rabl b/web/app/views/api_jam_tracks/show_for_client.rabl index 4e708a4ac..1b2db2fe6 100644 --- a/web/app/views/api_jam_tracks/show_for_client.rabl +++ b/web/app/views/api_jam_tracks/show_for_client.rabl @@ -2,6 +2,10 @@ object @jam_track attributes :id, :name, :description, :initial_play_silence, :original_artist +node :jam_track_right_id do |jam_track| + jam_track.right_for_user(current_user).id +end + child(:jam_track_tracks => :tracks) { attributes :id, :part, :instrument } diff --git a/web/app/views/clients/_download_jamtrack_templates.html.slim b/web/app/views/clients/_download_jamtrack_templates.html.slim index f87cf24fd..38aba682b 100644 --- a/web/app/views/clients/_download_jamtrack_templates.html.slim +++ b/web/app/views/clients/_download_jamtrack_templates.html.slim @@ -31,10 +31,11 @@ script type="text/template" id="template-download-jamtrack-state-keying" script type="text/template" id="template-download-jamtrack-state-initial" .state-initial .msg - | Initializing... + | Initializing JamTrack... + .spinner-large script type="text/template" id="template-download-jamtrack-state-errored" .state-errored .msg .retry - .a.button-orange.retry-button RETRY \ No newline at end of file + a.button-orange.retry-button RETRY \ No newline at end of file diff --git a/web/lib/tasks/sample_data.rake b/web/lib/tasks/sample_data.rake index 853194455..ff107ac00 100644 --- a/web/lib/tasks/sample_data.rake +++ b/web/lib/tasks/sample_data.rake @@ -1,6 +1,6 @@ require 'factory_girl' require 'open-uri' - +require './spec/factories.rb' # useful when run on a server namespace :db do desc "Add a simple one track recording to the database" diff --git a/web/spec/controllers/api_jam_tracks_controller_spec.rb b/web/spec/controllers/api_jam_tracks_controller_spec.rb index 62bd151e9..f22fb23f9 100644 --- a/web/spec/controllers/api_jam_tracks_controller_spec.rb +++ b/web/spec/controllers/api_jam_tracks_controller_spec.rb @@ -101,6 +101,7 @@ describe ApiJamTracksController do response.should be_success json = JSON.parse(response.body) json['jamtracks'].length.should eq(1) + json['jamtracks'][0]['jam_track_right_id'].should eq(right.id) json['next'].should be_nil end end