From 169c9b0ab103b0491e3cc26d33b05f5c66fff16f Mon Sep 17 00:00:00 2001 From: Seth Call Date: Tue, 10 Jun 2014 09:02:51 -0500 Subject: [PATCH] * VRFS-1774 - de-dup channels repeated * VRFS-1774 - filter out assigned channels * VRFS-1773 - no pre-assignment on step 3 (configure tracks) * VRFS-1774 - make radiobuttons appear more disabled; no more prod * VRFS-1767 - probably gone; but there is a more fundamental issue --- .../javascripts/configureTracksHelper.js | 16 ++-- web/app/assets/javascripts/voiceChatHelper.js | 83 +++++++++++++------ .../wizard/gear/step_configure_tracks.js | 12 ++- .../wizard/gear/step_configure_voice_chat.js | 2 +- .../wizard/gear/step_select_gear.js | 1 + .../assets/javascripts/wizard/gear_utils.js | 32 +++++-- .../client/voiceChatHelper.css.scss | 4 + .../wizard/gear/_gear_wizard.html.haml | 2 +- web/spec/features/gear_wizard_spec.rb | 6 ++ 9 files changed, 116 insertions(+), 42 deletions(-) diff --git a/web/app/assets/javascripts/configureTracksHelper.js b/web/app/assets/javascripts/configureTracksHelper.js index b834e99c3..4438770ef 100644 --- a/web/app/assets/javascripts/configureTracksHelper.js +++ b/web/app/assets/javascripts/configureTracksHelper.js @@ -21,11 +21,15 @@ var $outputChannelHolder = null; var $instrumentsHolder = null; - function loadChannels() { + function loadChannels(forceInputsToUnassign) { var musicPorts = jamClient.FTUEGetChannels(); $unassignedInputsHolder.empty(); $unassignedOutputsHolder.empty(); + + // reset all counts + $unassignedInputsHolder.find('.track-target').attr('track-count', '0'); + $unassignedOutputsHolder.find('.output-target').attr('output-count', '0'); $tracksHolder.find('.ftue-input').remove(); $outputChannelHolder.find('.ftue-input').remove(); @@ -38,7 +42,7 @@ context._.each(inputChannels, function (inputChannel) { var $channel = $(context._.template($templateAssignablePort.html(), inputChannel, { variable: 'data' })); - if(inputChannel.assignment == ASSIGNMENT.UNASSIGNED) { + if(forceInputsToUnassign || inputChannel.assignment == ASSIGNMENT.UNASSIGNED) { unassignInputChannel($channel); } else if(inputChannel.assignment == ASSIGNMENT.CHAT) { @@ -247,7 +251,7 @@ } } - function loadTrackInstruments() { + function loadTrackInstruments(forceInputsToUnassign) { var $trackInstruments = $instrumentsHolder.find('.track-instrument'); context._.each($trackInstruments, function(trackInstrument) { @@ -279,9 +283,9 @@ return saved; } - function reset() { - loadChannels(); - loadTrackInstruments(); + function reset(forceInputsToUnassign) { + loadChannels(forceInputsToUnassign); + loadTrackInstruments(forceInputsToUnassign); } function unassignOutputChannel($channel) { diff --git a/web/app/assets/javascripts/voiceChatHelper.js b/web/app/assets/javascripts/voiceChatHelper.js index ea5b5dc26..57d8d5d7d 100644 --- a/web/app/assets/javascripts/voiceChatHelper.js +++ b/web/app/assets/javascripts/voiceChatHelper.js @@ -20,21 +20,25 @@ var $selectedChatInput = null;// should only be used if isChatEnabled = true var saveImmediate = null; // if true, then every action by the user results in a save to the backend immediately, false means you have to call trySave to persist + // needed because iCheck fires iChecked event even when you programmatically change it, unlike when using .val(x) + var ignoreICheckeEvent = false; + function defaultReuse() { - $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); - $useChatInputRadio.removeAttr('checked'); + suppressChange(function(){ + $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); + $useChatInputRadio.removeAttr('checked'); + }) } function isChatEnabled() { - return $useChatInputRadio.is(':checked'); } - function reset() { + function reset(forceDisabledChat) { $selectedChatInput = null; - if(context.jamClient.TrackGetChatEnable()) { + if(!forceDisabledChat && context.jamClient.TrackGetChatEnable()) { enableChat(false); } else { @@ -82,16 +86,41 @@ }); if(!isChatEnabled()) { - $radioButtons.iCheck('disable'); + disableChatButtonsUI(); } $chatInputs.find('.chat-input').show().on('click', function() { - if(!isChatEnabled()) { - context.JK.prodBubble($parent.find('.use-chat-input h3'), 'chat-not-enabled', {}, { positions:['left']}); - } + // obnoxious; remove soon XXX + // if(!isChatEnabled()) { + // context.JK.prodBubble($parent.find('.use-chat-input h3'), 'chat-not-enabled', {}, { positions:['left']}); + // } }) } + function disableChatButtonsUI() { + var $radioButtons = $chatInputs.find('input[name="chat-device"]'); + $radioButtons.iCheck('disable') + $chatInputs.addClass('disabled'); + } + + function enableChatButtonsUI() { + var $radioButtons = $chatInputs.find('input[name="chat-device"]'); + $radioButtons.iCheck('enable') + $chatInputs.removeClass('disabled'); + + } + function suppressChange(proc) { + + ignoreICheckeEvent = true; + + try { + proc(); + } + finally { + ignoreICheckeEvent = false; + } + } + function disableChat(applyToBackend) { if(saveImmediate && applyToBackend) { logger.debug("voiceChatHelper: disabling chat to backend"); @@ -100,9 +129,10 @@ if(!result || result.length == 0) { // success - $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); - $useChatInputRadio.removeAttr('checked'); - + suppressChange(function() { + $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); + $useChatInputRadio.removeAttr('checked'); + }) } else { context.JK.Banner.showAlert('Unable to disable chat. ' + result); @@ -111,11 +141,12 @@ } else { logger.debug("voiceChatHelper: disabling chat UI only"); - $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); - $useChatInputRadio.removeAttr('checked'); + suppressChange(function() { + $reuseAudioInputRadio.iCheck('check').attr('checked', 'checked'); + $useChatInputRadio.removeAttr('checked'); + }) } - var $radioButtons = $chatInputs.find('input[name="chat-device"]'); - $radioButtons.iCheck('disable'); + disableChatButtonsUI() } function enableChat(applyToBackend) { @@ -126,9 +157,10 @@ if(!result || result.length == 0) { // success - $useChatInputRadio.iCheck('check').attr('checked', 'checked'); - $reuseAudioInputRadio.removeAttr('checked'); - + suppressChange(function() { + $useChatInputRadio.iCheck('check').attr('checked', 'checked'); + $reuseAudioInputRadio.removeAttr('checked'); + }) } else { context.JK.Banner.showAlert('Unable to enable chat. ' + result); @@ -137,12 +169,13 @@ } else { logger.debug("voiceChatHelper: enabling chat UI only"); - $useChatInputRadio.iCheck('check').attr('checked', 'checked'); - $reuseAudioInputRadio.removeAttr('checked'); + suppressChange(function() { + $useChatInputRadio.iCheck('check').attr('checked', 'checked'); + $reuseAudioInputRadio.removeAttr('checked'); + }) } - var $radioButtons = $chatInputs.find('input[name="chat-device"]'); - $radioButtons.iCheck('enable'); + enableChatButtonsUI(); } function handleChatEnabledToggle() { @@ -153,8 +186,8 @@ $reuseAudioInputRadio.closest('.iradio_minimal').css('position', 'absolute'); $useChatInputRadio.closest('.iradio_minimal').css('position', 'absolute'); - $reuseAudioInputRadio.on('ifChecked', function() { disableChat(true) }); - $useChatInputRadio.on('ifChecked', function() { enableChat(true) }); + $reuseAudioInputRadio.on('ifChecked', function() { if(!ignoreICheckeEvent) disableChat(true) }); + $useChatInputRadio.on('ifChecked', function() { if(!ignoreICheckeEvent) enableChat(true) }); } // gets the state of the UI diff --git a/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js b/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js index 2b8698846..495bf07e3 100644 --- a/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js +++ b/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js @@ -13,20 +13,27 @@ var configureTracksHelper = new context.JK.ConfigureTracksHelper(app); var $step = null; - + var successfullyAssignedOnce = false; function handleNext() { var saved = configureTracksHelper.trySave(); if(saved) { context.JK.GA.trackConfigureTracksCompletion(context.JK.detectOS()); + successfullyAssignedOnce = true; } return saved; } + function newSession() { + successfullyAssignedOnce = false; + } + function beforeShow() { - configureTracksHelper.reset(); + var forceInputsToUnassigned = !successfullyAssignedOnce; + + configureTracksHelper.reset(forceInputsToUnassigned) } function initialize(_$step) { @@ -35,6 +42,7 @@ configureTracksHelper.initialize($step); } + this.newSession = newSession; this.handleNext = handleNext; this.beforeShow = beforeShow; this.initialize = initialize; diff --git a/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js b/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js index c48e83a2a..b1b936d6e 100644 --- a/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js +++ b/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js @@ -20,7 +20,7 @@ var voiceChatHelper = new context.JK.VoiceChatHelper(app); function newSession() { - voiceChatHelper.reset(); + voiceChatHelper.reset(true); } function beforeShow() { diff --git a/web/app/assets/javascripts/wizard/gear/step_select_gear.js b/web/app/assets/javascripts/wizard/gear/step_select_gear.js index bfd75d343..e0e138cab 100644 --- a/web/app/assets/javascripts/wizard/gear/step_select_gear.js +++ b/web/app/assets/javascripts/wizard/gear/step_select_gear.js @@ -81,6 +81,7 @@ var optionsHtml = ''; optionsHtml = ''; context._.each(deviceInformation, function (deviceInfo, deviceId) { + if(deviceInfo.inputCount > 0) { optionsHtml += ''; } diff --git a/web/app/assets/javascripts/wizard/gear_utils.js b/web/app/assets/javascripts/wizard/gear_utils.js index f3b045cae..46e93e469 100644 --- a/web/app/assets/javascripts/wizard/gear_utils.js +++ b/web/app/assets/javascripts/wizard/gear_utils.js @@ -205,21 +205,39 @@ gearUtils.getChatInputs = function(){ - var musicPorts = jamClient.FTUEGetChannels(); + //var musicPorts = jamClient.FTUEGetChannels(); + var chatsOnCurrentDevice = context.jamClient.FTUEGetChatInputs(true); var chatsOnOtherDevices = context.jamClient.FTUEGetChatInputs(false); var chatInputs = []; - context._.each(musicPorts.inputs, function(input) { - chatInputs.push({id: input.id, name: input.name, assignment:input.assignment}); - }); + //context._.each(musicPorts.inputs, function(input) { + // chatInputs.push({id: input.id, name: input.name, assignment:input.assignment}); + //}); + + var deDupper = {}; + context._.each(chatsOnCurrentDevice, function(chatChannelName, chatChannelId) { + var chatInput = {id: chatChannelId, name: chatChannelName, assignment: ASSIGNMENT.UNASSIGNED}; + if(!deDupper[chatInput.id]) { + var assignment = context.jamClient.TrackGetAssignment(chatChannelId, true); + if(assignment != ASSIGNMENT.CHAT) { + chatInputs.push(chatInput); + deDupper[chatInput.id] = chatInput; + } + } + }) context._.each(chatsOnOtherDevices, function(chatChannelName, chatChannelId) { var chatInput = {id: chatChannelId, name: chatChannelName, assignment: null}; - var assignment = context.jamClient.TrackGetAssignment(chatChannelId, true); - chatInput.assignment = assignment; - chatInputs.push(chatInput); + if(!deDupper[chatInput.id]) { + var assignment = context.jamClient.TrackGetAssignment(chatChannelId, true); + chatInput.assignment = assignment; + + chatInputs.push(chatInput); + deDupper[chatInput.id] = chatInput; + } }) + logger.debug("chatInputs:", chatInputs) return chatInputs; } diff --git a/web/app/assets/stylesheets/client/voiceChatHelper.css.scss b/web/app/assets/stylesheets/client/voiceChatHelper.css.scss index 17a721813..8fd6b3e81 100644 --- a/web/app/assets/stylesheets/client/voiceChatHelper.css.scss +++ b/web/app/assets/stylesheets/client/voiceChatHelper.css.scss @@ -40,7 +40,11 @@ &.chat-inputs { height: 230px !important; overflow: auto; + color:white; + &.disabled { + color:gray; + } p { white-space: nowrap; display: inline-block; diff --git a/web/app/views/clients/wizard/gear/_gear_wizard.html.haml b/web/app/views/clients/wizard/gear/_gear_wizard.html.haml index 367349565..7aa5bff56 100644 --- a/web/app/views/clients/wizard/gear/_gear_wizard.html.haml +++ b/web/app/views/clients/wizard/gear/_gear_wizard.html.haml @@ -100,7 +100,7 @@ %a.button-orange.watch-video{href:'#'} WATCH VIDEO .wizard-step-column %h2 Select Voice Chat Option - %form + %form.voice .voicechat-option.reuse-audio-input %input{type:"radio", name: "voicechat", checked:"checked"} %h3 Use Music Microphone diff --git a/web/spec/features/gear_wizard_spec.rb b/web/spec/features/gear_wizard_spec.rb index 1acc2848a..ba5e2b222 100644 --- a/web/spec/features/gear_wizard_spec.rb +++ b/web/spec/features/gear_wizard_spec.rb @@ -25,6 +25,12 @@ describe "Gear Wizard", :js => true, :type => :feature, :capybara_feature => tru # step 3 - configure tracks find('.ftue-step-title', text: 'Configure Tracks') + + # drag one input over to tracks area http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#drag_to-instance_method + input = first('.ftue-input') + track_slot = first('.track-target') + input.drag_to(track_slot) + find('.btn-next.button-orange').trigger(:click) # step 4 - configure voice chat