diff --git a/web/app/assets/javascripts/bandProfile.js b/web/app/assets/javascripts/bandProfile.js
index 6812e751e..46ed0b72c 100644
--- a/web/app/assets/javascripts/bandProfile.js
+++ b/web/app/assets/javascripts/bandProfile.js
@@ -344,7 +344,7 @@
var instrument = musician.instruments[j];
var inst = '../assets/content/icon_instrument_default24.png';
if (instrument.instrument_id in instrument_logo_map) {
- inst = instrument_logo_map[instrument.instrument_id];
+ inst = instrument_logo_map[instrument.instrument_id].asset;
}
instrumentLogoHtml += '
';
}
diff --git a/web/app/assets/javascripts/findBand.js b/web/app/assets/javascripts/findBand.js
index 144bf4541..644df8a9d 100644
--- a/web/app/assets/javascripts/findBand.js
+++ b/web/app/assets/javascripts/findBand.js
@@ -97,7 +97,7 @@
for (var kk=0, klen=iter_pinstruments.length; kk';
}
diff --git a/web/app/assets/javascripts/findMusician.js b/web/app/assets/javascripts/findMusician.js
index e10458b3b..ee2847b68 100644
--- a/web/app/assets/javascripts/findMusician.js
+++ b/web/app/assets/javascripts/findMusician.js
@@ -100,7 +100,7 @@
instr_logos = '';
for (var jj=0, ilen=musician['instruments'].length; jj';
}
diff --git a/web/app/assets/javascripts/gear/step_configure_tracks.js b/web/app/assets/javascripts/gear/step_configure_tracks.js
index 31a0141a0..7a5c76915 100644
--- a/web/app/assets/javascripts/gear/step_configure_tracks.js
+++ b/web/app/assets/javascripts/gear/step_configure_tracks.js
@@ -15,6 +15,7 @@
var $templateTrackTarget = null;
var $unassignedChannelsHolder = null;
var $tracksHolder = null;
+ var $instrumentsHolder = null;
@@ -22,7 +23,7 @@
var musicPorts = jamClient.FTUEGetChannels();
$unassignedChannelsHolder.empty();
- $tracksHolder.find('.ftue-inputport').remove();
+ $tracksHolder.find('.ftue-input').remove();
var inputChannels = musicPorts.inputs;
@@ -48,7 +49,7 @@
}
$channel.draggable({
- revert: true,
+ helper: 'clone',
start: function() {
var $channel = $(this);
var $track = $channel.closest('.track-target');
@@ -70,23 +71,108 @@
})
}
+ // iterates through the dom and returns a pure data structure for track associations
+ function trackAssociations() {
+
+ var tracks = {};
+ tracks.tracks = [];
+ tracks.unassignedChannels = [];
+ var $unassignedChannels = $unassignedChannelsHolder.find('.ftue-input');
+ var $tracks = $tracksHolder.find('.track-target');
+
+ context._.each($unassignedChannels, function($unassignedTrack) {
+ $unassignedTrack = $($unassignedTrack);
+ var channelId = $unassignedTrack.attr('data-input-id');
+ tracks.unassignedChannels.push(channelId);
+ })
+
+ context._.each($tracks, function($track, index) {
+ $track = $($track);
+ var $assignedChannels = $track.find('.ftue-input');
+
+ var track = {index: index, channels:[]};
+ context._.each($assignedChannels, function($assignedChannel) {
+ $assignedChannel = $($assignedChannel);
+ track.channels.push($assignedChannel.attr('data-input-id'))
+ });
+
+ // sparse array
+ if(track.channels.length > 0) {
+ tracks.tracks.push(track);
+ }
+ var $instrument = $instrumentsHolder.find('.icon-instrument-select[data-num="' + index + '"]');
+ track.instrument_id = $instrument.data('instrument_id');
+ })
+ return tracks;
+ }
+
+ function validate(tracks) {
+ // there must be at least one assigned channel
+
+ if(tracks.tracks.length == 0) {
+ logger.debug("ConfigureTracks validation error: must have assigned at least one input port to a track.");
+ context.JK.Banner.showAlert('Must have assigned at least one input port to a track.');
+ return false;
+ }
+
+ context._.each(tracks.tracks, function(track) {
+ if(!track.instrument_id) {
+ logger.debug("ConfigureTracks validation error: all tracks with ports assigned must specify an instrument.");
+ context.JK.Banner.showAlert('All tracks with ports assigned must specify an instrument.');
+ return false;
+ }
+ });
+
+ return true;
+ }
+
+ function save(tracks) {
+
+ context._.each(tracks.unassignedChannels, function(unassignedChannelId) {
+ context.jamClient.TrackSetAssignment(unassignedChannelId, true, ASSIGNMENT.UNASSIGNED);
+ });
+
+ context._.each(tracks.tracks, function(track, index) {
+
+ var trackNumber = index + 1;
+
+ context._.each(track.channels, function(channelId) {
+ context.jamClient.TrackSetAssignment(channelId, true, trackNumber);
+
+ });
+ context.jamClient.TrackSetInstrument(trackNumber, track.instrument_id);
+ });
+
+ context.jamClient.TrackSaveAssignments();
+ }
+
+ function handleNext() {
+ var tracks = trackAssociations();
+
+ if(!validate(tracks)) {
+ return false;
+ }
+
+ save(tracks);
+
+ return true;
+ }
function beforeShow() {
-
loadChannels();
}
function unassignChannel($channel) {
var $originallyAssignedTrack = $channel.closest('.track-target');
$unassignedChannelsHolder.append($channel);
- $originallyAssignedTrack.attr('track-count', $originallyAssignedTrack.find('.ftue-input').length)
+ $originallyAssignedTrack.attr('track-count', $originallyAssignedTrack.find('.ftue-input:not(.ui-draggable-dragging)').length)
}
function addChannelToTrack($channel, $track) {
var $originallyAssignedTrack = $channel.closest('.track-target');
$track.append($channel);
- $track.attr('track-count', $track.find('.ftue-input').length);
- $originallyAssignedTrack.attr('track-count', $originallyAssignedTrack.find('.ftue-input').length)
+ $track.attr('track-count', $track.find('.ftue-input:not(.ui-draggable-dragging)').length);
+ $originallyAssignedTrack.attr('track-count', $originallyAssignedTrack.find('.ftue-input:not(.ui-draggable-dragging)').length)
}
function initializeUnassignedDroppable() {
@@ -95,9 +181,8 @@
activeClass: 'drag-in-progress',
hoverClass: 'drag-hovering',
drop: function( event, ui ) {
- console.log("event, ui", event, ui)
var $channel = ui.draggable;
- $channel.css('left', '0').css('top', '0');
+ //$channel.css('left', '0').css('top', '0');
unassignChannel($channel);
}
});
@@ -115,12 +200,22 @@
drop: function( event, ui ) {
var $track = $(this);
var $channel = ui.draggable;
- $channel.css('left', '0').css('top', '0');
+ //$channel.css('left', '0').css('top', '0');
addChannelToTrack($channel, $track);
}
});
}
}
+
+ function initializeInstrumentDropdown() {
+ var i;
+ for(i = 0; i < MAX_TRACKS; i++) {
+ var $instrumentSelect = context.JK.iconInstrumentSelect();
+ $instrumentSelect.attr('data-num', i);
+ $instrumentsHolder.append($instrumentSelect);
+ }
+ }
+
function initialize(_$step) {
$step = _$step;
@@ -128,12 +223,15 @@
$templateTrackTarget = $('#template-track-target');
$unassignedChannelsHolder = $step.find('.unassigned-channels');
$tracksHolder = $step.find('.tracks');
+ $instrumentsHolder = $step.find('.instruments');
initializeUnassignedDroppable();
initializeTrackDroppables();
+ initializeInstrumentDropdown();
}
+ this.handleNext = handleNext;
this.beforeShow = beforeShow;
this.initialize = initialize;
diff --git a/web/app/assets/javascripts/gear/step_select_gear.js b/web/app/assets/javascripts/gear/step_select_gear.js
index 4b97529ee..5a14006df 100644
--- a/web/app/assets/javascripts/gear/step_select_gear.js
+++ b/web/app/assets/javascripts/gear/step_select_gear.js
@@ -149,7 +149,7 @@
deviceInfo.id = device.guid;
deviceInfo.type = determineDeviceType(device.guid, device.display_name);
- console.log("deviceInfo.type: " + deviceInfo.type)
+ logger.debug("deviceInfo.type: " + deviceInfo.type)
deviceInfo.displayType = audioDeviceBehavior[deviceInfo.type].display;
deviceInfo.displayName = device.display_name;
@@ -727,7 +727,7 @@
// prod the user to watch the video if the input or output changes type
- console.log("selectedDeviceInfo", selectedDeviceInfo);
+ logger.debug("selectedDeviceInfo", selectedDeviceInfo);
}
function changeDevice() {
diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js
index 3334d5c38..8a092562f 100644
--- a/web/app/assets/javascripts/jam_rest.js
+++ b/web/app/assets/javascripts/jam_rest.js
@@ -989,12 +989,19 @@
};
function createDiagnostic(options) {
+ var data = null;
+ try {
+ data = JSON.stringify(options)
+ }
+ catch(e) {
+ data = JSON.stringify({data_error: "unable to JSON.stringify debug data:" + e.toString()})
+ }
return $.ajax({
type: "POST",
url: '/api/diagnostics',
dataType: "json",
contentType: 'application/json',
- data: JSON.stringify(options)
+ data: data,
});
}
diff --git a/web/app/assets/javascripts/profile.js b/web/app/assets/javascripts/profile.js
index a8b15cdd0..b8e2a5810 100644
--- a/web/app/assets/javascripts/profile.js
+++ b/web/app/assets/javascripts/profile.js
@@ -614,7 +614,7 @@
var instrument = musician.instruments[j];
var inst = '/assets/content/icon_instrument_default24.png';
if (instrument.instrument_id in instrument_logo_map) {
- inst = instrument_logo_map[instrument.instrument_id];
+ inst = instrument_logo_map[instrument.instrument_id].asset;
}
instrumentLogoHtml += '
';
}
diff --git a/web/app/assets/javascripts/searchResults.js b/web/app/assets/javascripts/searchResults.js
index 1af9398e5..ddea50655 100644
--- a/web/app/assets/javascripts/searchResults.js
+++ b/web/app/assets/javascripts/searchResults.js
@@ -226,7 +226,7 @@
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];
+ inst = instrument_logo_map[instruments[i].instrument_id].asset;
instrumentLogoHtml += '
';
}
}
diff --git a/web/app/assets/javascripts/sessionList.js b/web/app/assets/javascripts/sessionList.js
index 6563f8544..456ee9c02 100644
--- a/web/app/assets/javascripts/sessionList.js
+++ b/web/app/assets/javascripts/sessionList.js
@@ -93,7 +93,7 @@
logger.debug("Find:Finding instruments. Participant tracks:", participant.tracks);
var inst = '../assets/content/icon_instrument_default24.png';
if (track.instrument_id in instrument_logo_map) {
- inst = instrument_logo_map[track.instrument_id];
+ inst = instrument_logo_map[track.instrument_id].asset;
}
instrumentLogoHtml += '
';
}
diff --git a/web/app/assets/javascripts/utils.js b/web/app/assets/javascripts/utils.js
index e45ef62ec..eb58ab543 100644
--- a/web/app/assets/javascripts/utils.js
+++ b/web/app/assets/javascripts/utils.js
@@ -86,11 +86,54 @@
$.each(context._.keys(icon_map_base), function (index, instrumentId) {
var icon = icon_map_base[instrumentId];
- instrumentIconMap24[instrumentId] = "/assets/content/icon_instrument_" + icon + "24.png";
- instrumentIconMap45[instrumentId] = "/assets/content/icon_instrument_" + icon + "45.png";
- instrumentIconMap256[instrumentId] = "/assets/content/icon_instrument_" + icon + "256.png";
+ instrumentIconMap24[instrumentId] = {asset: "/assets/content/icon_instrument_" + icon + "24.png", name: instrumentId};
+ instrumentIconMap45[instrumentId] = {asset: "/assets/content/icon_instrument_" + icon + "45.png", name: instrumentId};
+ instrumentIconMap256[instrumentId] = {asset: "/assets/content/icon_instrument_" + icon + "256.png", name: instrumentId};
});
+ context.JK.iconInstrumentSelect = function() {
+ var $select = $(context._.template($('#template-icon-instrument-select').html(), {instruments:instrumentIconMap24}, { variable: 'data' }));
+ var $ul = $select.find('ul');
+ var $currentInstrument = $select.find('.current-instrument');
+
+ context.JK.hoverBubble($currentInstrument, $ul.html(), {
+ trigger:'click',
+ cssClass: 'icon-instrument-selector-popup',
+ spikeGirth:0,
+ spikeLength:0,
+ width:150,
+ closeWhenOthersOpen: true,
+ preShow: function() {
+ },
+ postShow:function(container) {
+ $(container).find('li').click(onInstrumentSelected)
+ }});
+
+ function select(instrument_id) {
+ $currentInstrument.empty();
+ $currentInstrument.removeClass('none');
+ $currentInstrument.append('
');
+ }
+ function close() {
+ $currentInstrument.btOff();
+ }
+
+ function onInstrumentSelected() {
+ var $li = $(this);
+ var instrument_id = $li.attr('data-instrument-id');
+
+ select(instrument_id);
+ close();
+ $select.data('instrument_id', instrument_id);
+ $select.triggerHandler('instrument_selected', {instrument_id: instrument_id});
+ return false;
+ };
+
+ $currentInstrument.text('?');
+
+ return $select;
+ }
+
/**
* Associates a help bubble on hover (by default) with the specified $element, using jquery.bt.js (BeautyTips)
* @param $element The element that should show the help when hovered
@@ -366,26 +409,26 @@
context.JK.getInstrumentIcon24 = function (instrument) {
if (instrument in instrumentIconMap24) {
- return instrumentIconMap24[instrument];
+ return instrumentIconMap24[instrument].asset;
}
- return instrumentIconMap24["default"];
+ return instrumentIconMap24["default"].asset;
};
context.JK.getInstrumentIcon45 = function (instrument) {
if (instrument in instrumentIconMap45) {
- return instrumentIconMap45[instrument];
+ return instrumentIconMap45[instrument].asset;
}
- return instrumentIconMap45["default"];
+ return instrumentIconMap45["default"].asset;
};
context.JK.getInstrumentIcon256 = function (instrument) {
if (instrument in instrumentIconMap256) {
- return instrumentIconMap256[instrument];
+ return instrumentIconMap256[instrument].asset;
}
- return instrumentIconMap256["default"];
+ return instrumentIconMap256["default"].asset;
};
// meant to pass in a bunch of images with an instrument-id attribute on them.
diff --git a/web/app/assets/stylesheets/client/client.css b/web/app/assets/stylesheets/client/client.css
index 844f9ca42..b01a9bd31 100644
--- a/web/app/assets/stylesheets/client/client.css
+++ b/web/app/assets/stylesheets/client/client.css
@@ -46,6 +46,7 @@
*= require ./textMessageDialog
*= require ./acceptFriendRequestDialog
*= require ./launchAppDialog
+ *= require ./iconInstrumentSelect
*= require ./terms
*= require ./createSession
*= require ./feed
diff --git a/web/app/assets/stylesheets/client/gearWizard.css.scss b/web/app/assets/stylesheets/client/gearWizard.css.scss
index 82d262344..c0367d69f 100644
--- a/web/app/assets/stylesheets/client/gearWizard.css.scss
+++ b/web/app/assets/stylesheets/client/gearWizard.css.scss
@@ -366,11 +366,27 @@
.wizard-step[layout-wizard-step="2"] {
.wizard-step-content .wizard-step-column {
width:25%;
+
+
+ &:nth-of-type(3) {
+ width:40%;
+ }
+
+
+ &:nth-of-type(4) {
+ width:10%;
+ }
+ }
+
+ .icon-instrument-select {
+ padding:3px 0; // to combine 24 of .current-instrument + 3x on either side
+ margin:0 auto 15px; // 15 margin-bottom to match tracks on the left
+ width:30px;
}
.unassigned-channels {
min-height:240px;
- overflow-y:scroll;
+ overflow-y:auto;
//padding-right:18px; // to keep draggables off of scrollbar. maybe necessary
&.drag-in-progress {
@@ -391,7 +407,7 @@
position:absolute;
}
.track {
-
+ margin-bottom: 15px;
.track-target {
&.possible-target {
border-color:white;
@@ -404,6 +420,7 @@
.ftue-input {
+ font-size:12px;
cursor: move;
padding: 4px;
border: solid 1px #999;
@@ -412,11 +429,14 @@
overflow:hidden;
text-align:left;
direction:rtl;
- font-size:12px;
-
+ text-overflow:ellipses;
&.ui-draggable-dragging{
margin-bottom:0;
}
+
+ &:hover {
+ color:white;
+ }
}
.track-target {
@@ -425,7 +445,6 @@
padding: 4px;
border: solid 1px #999;
margin-left: 15px;
- margin-bottom: 15px;
height:20px;
overflow:hidden;
@@ -444,15 +463,26 @@
}
}
- &[track-count="2"]:not(.drag-in-progress) {
+ .placeholder {
+ display:none;
+ font-size:12px;
+ }
+
+ &[track-count="0"] {
+ .placeholder {
+ display:inline;
+ }
+ }
+
+ &[track-count="2"] {
.ftue-input {
width:50%;
display:inline-block;
}
- .ftue-input:nth-child(1)::before {
- content: ' , '
- }
- ;
+ /**.ftue-input:nth-child(1)::before {
+ content: ',';
+ padding-right:3px;
+ }*/
}
}
}
diff --git a/web/app/assets/stylesheets/client/iconInstrumentSelect.css.scss b/web/app/assets/stylesheets/client/iconInstrumentSelect.css.scss
new file mode 100644
index 000000000..601222f00
--- /dev/null
+++ b/web/app/assets/stylesheets/client/iconInstrumentSelect.css.scss
@@ -0,0 +1,47 @@
+.icon-instrument-select {
+ .current-instrument {
+ width:24px;
+ height:24px;
+ font-size:20px;
+ cursor:pointer;
+
+ &.none {
+ height:22px;
+ width:22px;
+ border:1px solid white;
+ -webkit-border-radius:12px;
+ -moz-border-radius:12px;
+ border-radius:12px;
+ line-height:22px;
+ vertical-align: middle;
+ text-align:center;
+ }
+ }
+ ul {
+ display:none;
+ border:1px solid white;
+ max-height:250px;
+ position:absolute;
+ overflow:auto;
+ width:150px;
+ background-color:#333;
+ text-align:left;
+ }
+}
+
+.icon-instrument-selector-popup {
+ .bt-content {
+ height:150px;
+ width:150px;
+ background-color:#333;
+ text-align:left;
+ overflow:auto;
+ border:1px solid #ED3618;
+
+ li {
+ margin-left:5px;
+ list-style-type: none;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/client/sidebar.css.scss b/web/app/assets/stylesheets/client/sidebar.css.scss
index 9491f54c0..ff21873e4 100644
--- a/web/app/assets/stylesheets/client/sidebar.css.scss
+++ b/web/app/assets/stylesheets/client/sidebar.css.scss
@@ -206,7 +206,7 @@
.chat-message-sender {
font-weight:bold;
margin-right:10px;
- color: #020C81;
+ color: #ED3618;
&:after {
content:':'
diff --git a/web/app/views/clients/_iconInstrumentSelect.html.haml b/web/app/views/clients/_iconInstrumentSelect.html.haml
new file mode 100644
index 000000000..50ba7271d
--- /dev/null
+++ b/web/app/views/clients/_iconInstrumentSelect.html.haml
@@ -0,0 +1,12 @@
+%script{type: 'text/template', id: 'template-icon-instrument-select'}
+ .icon-instrument-select
+ .current-instrument.none
+ %a.arrow-down
+ %ul
+ = '{% _.each(data.instruments, function(instrument, instrumentId) { %}'
+ %li{'data-instrument-id' => '{{instrumentId}}'}
+ %a{href:'#'}
+ %img{src: '{{instrument.asset}}'}
+ = '{{instrument.name}}'
+ = '{% }) %}'
+
diff --git a/web/app/views/clients/gear/_gear_wizard.html.haml b/web/app/views/clients/gear/_gear_wizard.html.haml
index e91229d2c..7aeaa2e4c 100644
--- a/web/app/views/clients/gear/_gear_wizard.html.haml
+++ b/web/app/views/clients/gear/_gear_wizard.html.haml
@@ -148,7 +148,8 @@
%h2 Track Input Port(s)
.tracks
.wizard-step-column
- %h2 Track Instrument
+ %h2 Instrument
+ .instruments
.wizard-step{ 'layout-wizard-step' => "3", 'dialog-title' => "Configure Voice Chat", 'dialog-purpose' => "ConfigureVoiceChat" }
.ftuesteps
@@ -245,9 +246,10 @@
= '{{data.name}}'
%script{type: 'text/template', id: 'template-assignable-port'}
- .ftue-input{id: '{{data.id}}'} {{data.name}}
+ .ftue-input{'data-input-id' => '{{data.id}}'} {{data.name}}
%script{type: 'text/template', id: 'template-track-target'}
.track{'data-num' => '{{data.num}}'}
.num {{data.num + 1}}:
- .track-target{'data-num' => '{{data.num}}'}
+ .track-target{'data-num' => '{{data.num}}', 'track-count' => 0}
+ %span.placeholder None
diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb
index 9b1b8cbfc..ee8f3bbae 100644
--- a/web/app/views/clients/index.html.erb
+++ b/web/app/views/clients/index.html.erb
@@ -18,6 +18,7 @@
<%= render "vu_meters" %>
<%= render "ftue" %>
<%= render "jamServer" %>
+<%= render "iconInstrumentSelect" %>
<%= render "clients/gear/gear_wizard" %>
<%= render "terms" %>
<%= render "leaveSessionWarning" %>