VRFS-38. Invitations in create session.
This commit is contained in:
parent
1d9bb541ee
commit
889887d79c
|
|
@ -4,6 +4,9 @@
|
|||
context.JK.CreateSessionScreen = function(app) {
|
||||
var logger = context.JK.logger;
|
||||
var realtimeMessaging = context.JK.JamServer;
|
||||
var autoComplete = null;
|
||||
var usernames = [];
|
||||
var userids = [];
|
||||
|
||||
/*
|
||||
Message from Seth on sequence for creating/joining sessions:
|
||||
|
|
@ -20,7 +23,57 @@ Message from Seth on sequence for creating/joining sessions:
|
|||
(02:32:52 PM) Seth Call: and LOGIN_MUSIC_SESSION is deprecated/junk
|
||||
*/
|
||||
|
||||
function afterShow(data) {}
|
||||
function beforeShow(data) {
|
||||
usernames = [];
|
||||
userids = [];
|
||||
resetForm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset form to initial state.
|
||||
*/
|
||||
function resetForm() {
|
||||
$form = $('#create-session-form');
|
||||
$('textarea[name="description"]', $form).val('');
|
||||
}
|
||||
|
||||
function afterShow(data) {
|
||||
// TODO: This won't work in the long-term. We'll need to provide
|
||||
// a handlers which accepts some characters and only returns users
|
||||
// who are musicians who match that input string. Once we get there,
|
||||
// we could just use the ajax functionality of the autocomplete plugin.
|
||||
//
|
||||
// But for now:
|
||||
// Load the users list into our local array for autocomplete.
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "/api/users"
|
||||
}).done(function(response) {
|
||||
$.each(response, function() {
|
||||
usernames.push(this.name);
|
||||
userids.push(this.id);
|
||||
});
|
||||
// Hook up the autocomplete.
|
||||
autoCompleteOptions = {
|
||||
lookup: {suggestions:usernames, data: userids},
|
||||
onSelect: addInvitation
|
||||
};
|
||||
if (!(autoComplete)) {
|
||||
autoComplete = $('#invitations').autocomplete(autoCompleteOptions);
|
||||
} else {
|
||||
autoComplete.setOptions(autoCompleteOptions);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function addInvitation(value, data) {
|
||||
var username = value;
|
||||
var userid = data;
|
||||
var template = $('#template-added-invitation').html(); // TODO: cache this
|
||||
var inviteHtml = JK.fillTemplate(template, {userId: userid, userName: username});
|
||||
$('#added-invitations').append(inviteHtml);
|
||||
$('#invitations').select();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the form, returning a list of errors.
|
||||
|
|
@ -46,27 +99,77 @@ Message from Seth on sequence for creating/joining sessions:
|
|||
}
|
||||
var $this = $(this);
|
||||
var data = $this.formToObject();
|
||||
data.musician_access = Boolean(data.musician_access);
|
||||
data.client_id = app.clientId;
|
||||
if (typeof(data.genres) === "string") {
|
||||
data.genres = [data.genres];
|
||||
}
|
||||
|
||||
// FIXME: Hard-code tracks for now. Needs to be pickable
|
||||
data.tracks = [
|
||||
{ instrument_id: "electric guitar", sound: "mono" },
|
||||
{ instrument_id: "keyboard", sound: "mono" }
|
||||
];
|
||||
|
||||
var url = "/api/sessions";
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
dataType: "json",
|
||||
contentType: 'application/json',
|
||||
url: url,
|
||||
data: data
|
||||
processData:false,
|
||||
data: JSON.stringify(data)
|
||||
}).done(
|
||||
function(response) {
|
||||
var newSessionId = response.id;
|
||||
self.location = '#/session/' + newSessionId;
|
||||
createInvitations(newSessionId, function() {
|
||||
self.location = '#/session/' + newSessionId;
|
||||
});
|
||||
}
|
||||
);
|
||||
).fail(function(jqXHR, textStatus, errorMessage) {
|
||||
app.notify({title: textStatus, text: errorMessage, detail: jqXHR.responseText});
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function createInvitations(sessionId, onComplete) {
|
||||
var callCount = 0;
|
||||
$('#added-invitations .invitation').each(function() {
|
||||
callCount++;
|
||||
var invite_id = $(this).attr('user-id');
|
||||
var invite = {
|
||||
music_session: sessionId,
|
||||
receiver: invite_id
|
||||
};
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/api/invitations",
|
||||
data: invite
|
||||
}).done(function(response) {
|
||||
callCount--;
|
||||
}).fail(function(jqXHR, textStatus, errorMessage) {
|
||||
app.notify({title: textStatus, text: errorMessage, detail: jqXHR.responseText});
|
||||
});
|
||||
});
|
||||
// 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 {
|
||||
setTimeout(checker, 10);
|
||||
}
|
||||
}
|
||||
checker();
|
||||
}
|
||||
|
||||
function events() {
|
||||
$('#create-session-form').submit(submitForm);
|
||||
$('#added-invitations').on("click", ".invitation span", removeInvitation);
|
||||
}
|
||||
|
||||
function removeInvitation(evt) {
|
||||
$(this).closest('.invitation').remove();
|
||||
}
|
||||
|
||||
function loadGenres() {
|
||||
|
|
@ -89,8 +192,8 @@ Message from Seth on sequence for creating/joining sessions:
|
|||
this.initialize = function() {
|
||||
events();
|
||||
loadGenres();
|
||||
screenBindings = { 'afterShow': afterShow };
|
||||
app.bindScreen('session', screenBindings);
|
||||
screenBindings = { 'afterShow': afterShow, 'beforeShow': beforeShow };
|
||||
app.bindScreen('createSession', screenBindings);
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,433 @@
|
|||
/**
|
||||
* Ajax Autocomplete for jQuery, version 1.1.5
|
||||
* (c) 2010 Tomas Kirda, Vytautas Pranskunas
|
||||
*
|
||||
* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license.
|
||||
* For details, see the web site: http://www.devbridge.com/projects/autocomplete/jquery/
|
||||
*
|
||||
* Last Review: 07/24/2012
|
||||
*/
|
||||
|
||||
/*jslint onevar: true, evil: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */
|
||||
/*global window: true, document: true, clearInterval: true, setInterval: true, jQuery: true */
|
||||
|
||||
(function ($) {
|
||||
|
||||
var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
|
||||
|
||||
function fnFormatResult(value, data, currentValue) {
|
||||
var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')';
|
||||
return value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
|
||||
}
|
||||
|
||||
function Autocomplete(el, options) {
|
||||
this.el = $(el);
|
||||
this.el.attr('autocomplete', 'off');
|
||||
this.suggestions = [];
|
||||
this.data = [];
|
||||
this.badQueries = [];
|
||||
this.selectedIndex = -1;
|
||||
this.currentValue = this.el.val();
|
||||
this.intervalId = 0;
|
||||
this.cachedResponse = [];
|
||||
this.onChangeInterval = null;
|
||||
this.onChange = null;
|
||||
this.ignoreValueChange = false;
|
||||
this.serviceUrl = options.serviceUrl;
|
||||
this.isLocal = false;
|
||||
this.options = {
|
||||
autoSubmit: false,
|
||||
minChars: 1,
|
||||
maxHeight: 300,
|
||||
deferRequestBy: 0,
|
||||
width: 0,
|
||||
highlight: true,
|
||||
params: {},
|
||||
fnFormatResult: fnFormatResult,
|
||||
delimiter: null,
|
||||
zIndex: 9999
|
||||
};
|
||||
this.initialize();
|
||||
this.setOptions(options);
|
||||
this.el.data('autocomplete', this);
|
||||
}
|
||||
|
||||
$.fn.autocomplete = function (options, optionName) {
|
||||
|
||||
var autocompleteControl;
|
||||
|
||||
if (typeof options == 'string') {
|
||||
autocompleteControl = this.data('autocomplete');
|
||||
if (typeof autocompleteControl[options] == 'function') {
|
||||
autocompleteControl[options](optionName);
|
||||
}
|
||||
} else {
|
||||
autocompleteControl = new Autocomplete(this.get(0) || $('<input />'), options);
|
||||
}
|
||||
return autocompleteControl;
|
||||
};
|
||||
|
||||
|
||||
Autocomplete.prototype = {
|
||||
|
||||
killerFn: null,
|
||||
|
||||
initialize: function () {
|
||||
|
||||
var me, uid, autocompleteElId;
|
||||
me = this;
|
||||
uid = Math.floor(Math.random() * 0x100000).toString(16);
|
||||
autocompleteElId = 'Autocomplete_' + uid;
|
||||
|
||||
this.killerFn = function (e) {
|
||||
if ($(e.target).parents('.autocomplete').size() === 0) {
|
||||
me.killSuggestions();
|
||||
me.disableKillerFn();
|
||||
}
|
||||
};
|
||||
|
||||
if (!this.options.width) { this.options.width = this.el.width(); }
|
||||
this.mainContainerId = 'AutocompleteContainter_' + uid;
|
||||
|
||||
$('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body');
|
||||
|
||||
this.container = $('#' + autocompleteElId);
|
||||
this.fixPosition();
|
||||
if (window.opera) {
|
||||
this.el.keypress(function (e) { me.onKeyPress(e); });
|
||||
} else {
|
||||
this.el.keydown(function (e) { me.onKeyPress(e); });
|
||||
}
|
||||
this.el.keyup(function (e) { me.onKeyUp(e); });
|
||||
this.el.blur(function () { me.enableKillerFn(); });
|
||||
this.el.focus(function () { me.fixPosition(); });
|
||||
this.el.change(function () { me.onValueChanged(); });
|
||||
},
|
||||
|
||||
extendOptions: function (options) {
|
||||
$.extend(this.options, options);
|
||||
},
|
||||
|
||||
setOptions: function (options) {
|
||||
var o = this.options;
|
||||
this.extendOptions(options);
|
||||
if (o.lookup || o.isLocal) {
|
||||
this.isLocal = true;
|
||||
if ($.isArray(o.lookup)) { o.lookup = { suggestions: o.lookup, data: [] }; }
|
||||
}
|
||||
$('#' + this.mainContainerId).css({ zIndex: o.zIndex });
|
||||
this.container.css({ maxHeight: o.maxHeight + 'px', width: o.width });
|
||||
},
|
||||
|
||||
clearCache: function () {
|
||||
this.cachedResponse = [];
|
||||
this.badQueries = [];
|
||||
},
|
||||
|
||||
disable: function () {
|
||||
this.disabled = true;
|
||||
},
|
||||
|
||||
enable: function () {
|
||||
this.disabled = false;
|
||||
},
|
||||
|
||||
fixPosition: function () {
|
||||
var offset = this.el.offset();
|
||||
$('#' + this.mainContainerId).css({ top: (offset.top + this.el.innerHeight()) + 'px', left: offset.left + 'px' });
|
||||
},
|
||||
|
||||
enableKillerFn: function () {
|
||||
var me = this;
|
||||
$(document).bind('click', me.killerFn);
|
||||
},
|
||||
|
||||
disableKillerFn: function () {
|
||||
var me = this;
|
||||
$(document).unbind('click', me.killerFn);
|
||||
},
|
||||
|
||||
killSuggestions: function () {
|
||||
var me = this;
|
||||
this.stopKillSuggestions();
|
||||
this.intervalId = window.setInterval(function () { me.hide(); me.stopKillSuggestions(); }, 300);
|
||||
},
|
||||
|
||||
stopKillSuggestions: function () {
|
||||
window.clearInterval(this.intervalId);
|
||||
},
|
||||
|
||||
onValueChanged: function () {
|
||||
this.change(this.selectedIndex);
|
||||
},
|
||||
|
||||
onKeyPress: function (e) {
|
||||
if (this.disabled || !this.enabled) { return; }
|
||||
// return will exit the function
|
||||
// and event will not be prevented
|
||||
switch (e.keyCode) {
|
||||
case 27: //KEY_ESC:
|
||||
this.el.val(this.currentValue);
|
||||
this.hide();
|
||||
break;
|
||||
case 9: //KEY_TAB:
|
||||
case 13: //KEY_RETURN:
|
||||
if (this.selectedIndex === -1) {
|
||||
this.hide();
|
||||
return;
|
||||
}
|
||||
this.select(this.selectedIndex);
|
||||
if (e.keyCode === 9) { return; }
|
||||
break;
|
||||
case 38: //KEY_UP:
|
||||
this.moveUp();
|
||||
break;
|
||||
case 40: //KEY_DOWN:
|
||||
this.moveDown();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
},
|
||||
|
||||
onKeyUp: function (e) {
|
||||
if (this.disabled) { return; }
|
||||
switch (e.keyCode) {
|
||||
case 38: //KEY_UP:
|
||||
case 40: //KEY_DOWN:
|
||||
return;
|
||||
}
|
||||
clearInterval(this.onChangeInterval);
|
||||
if (this.currentValue !== this.el.val()) {
|
||||
if (this.options.deferRequestBy > 0) {
|
||||
// Defer lookup in case when value changes very quickly:
|
||||
var me = this;
|
||||
this.onChangeInterval = setInterval(function () { me.onValueChange(); }, this.options.deferRequestBy);
|
||||
} else {
|
||||
this.onValueChange();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onValueChange: function () {
|
||||
clearInterval(this.onChangeInterval);
|
||||
this.currentValue = this.el.val();
|
||||
var q = this.getQuery(this.currentValue);
|
||||
this.selectedIndex = -1;
|
||||
if (this.ignoreValueChange) {
|
||||
this.ignoreValueChange = false;
|
||||
return;
|
||||
}
|
||||
if (q === '' || q.length < this.options.minChars) {
|
||||
this.hide();
|
||||
} else {
|
||||
this.getSuggestions(q);
|
||||
}
|
||||
},
|
||||
|
||||
getQuery: function (val) {
|
||||
var d, arr;
|
||||
d = this.options.delimiter;
|
||||
if (!d) { return $.trim(val); }
|
||||
arr = val.split(d);
|
||||
return $.trim(arr[arr.length - 1]);
|
||||
},
|
||||
|
||||
getSuggestionsLocal: function (q) {
|
||||
var ret, arr, len, val, i;
|
||||
arr = this.options.lookup;
|
||||
len = arr.suggestions.length;
|
||||
ret = { suggestions: [], data: [] };
|
||||
q = q.toLowerCase();
|
||||
for (i = 0; i < len; i++) {
|
||||
val = arr.suggestions[i];
|
||||
if (val.toLowerCase().indexOf(q) === 0) {
|
||||
ret.suggestions.push(val);
|
||||
ret.data.push(arr.data[i]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
|
||||
getSuggestions: function (q) {
|
||||
|
||||
var cr, me;
|
||||
cr = this.isLocal ? this.getSuggestionsLocal(q) : this.cachedResponse[q]; //dadeta this.options.isLocal ||
|
||||
if (cr && $.isArray(cr.suggestions)) {
|
||||
this.suggestions = cr.suggestions;
|
||||
this.data = cr.data;
|
||||
this.suggest();
|
||||
} else if (!this.isBadQuery(q)) {
|
||||
me = this;
|
||||
me.options.params.query = q;
|
||||
$.get(this.serviceUrl, me.options.params, function (txt) { me.processResponse(txt); }, 'text');
|
||||
}
|
||||
},
|
||||
|
||||
isBadQuery: function (q) {
|
||||
var i = this.badQueries.length;
|
||||
while (i--) {
|
||||
if (q.indexOf(this.badQueries[i]) === 0) { return true; }
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
hide: function () {
|
||||
this.enabled = false;
|
||||
this.selectedIndex = -1;
|
||||
this.container.hide();
|
||||
},
|
||||
|
||||
suggest: function () {
|
||||
|
||||
if (this.suggestions.length === 0) {
|
||||
this.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
var me, len, div, f, v, i, s, mOver, mClick;
|
||||
me = this;
|
||||
len = this.suggestions.length;
|
||||
f = this.options.fnFormatResult;
|
||||
v = this.getQuery(this.currentValue);
|
||||
mOver = function (xi) { return function () { me.activate(xi); }; };
|
||||
mClick = function (xi) { return function () { me.select(xi); }; };
|
||||
this.container.hide().empty();
|
||||
for (i = 0; i < len; i++) {
|
||||
s = this.suggestions[i];
|
||||
div = $((me.selectedIndex === i ? '<div class="selected"' : '<div') + ' title="' + s + '">' + f(s, this.data[i], v) + '</div>');
|
||||
div.mouseover(mOver(i));
|
||||
div.click(mClick(i));
|
||||
this.container.append(div);
|
||||
}
|
||||
this.enabled = true;
|
||||
this.container.show();
|
||||
},
|
||||
|
||||
processResponse: function (text) {
|
||||
var response;
|
||||
try {
|
||||
response = eval('(' + text + ')');
|
||||
} catch (err) { return; }
|
||||
if (!$.isArray(response.data)) { response.data = []; }
|
||||
if (!this.options.noCache) {
|
||||
this.cachedResponse[response.query] = response;
|
||||
if (response.suggestions.length === 0) { this.badQueries.push(response.query); }
|
||||
}
|
||||
if (response.query === this.getQuery(this.currentValue)) {
|
||||
this.suggestions = response.suggestions;
|
||||
this.data = response.data;
|
||||
this.suggest();
|
||||
}
|
||||
},
|
||||
|
||||
activate: function (index) {
|
||||
var divs, activeItem;
|
||||
divs = this.container.children();
|
||||
// Clear previous selection:
|
||||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) {
|
||||
$(divs.get(this.selectedIndex)).removeClass();
|
||||
}
|
||||
this.selectedIndex = index;
|
||||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) {
|
||||
activeItem = divs.get(this.selectedIndex);
|
||||
$(activeItem).addClass('selected');
|
||||
}
|
||||
return activeItem;
|
||||
},
|
||||
|
||||
deactivate: function (div, index) {
|
||||
div.className = '';
|
||||
if (this.selectedIndex === index) { this.selectedIndex = -1; }
|
||||
},
|
||||
|
||||
select: function (i) {
|
||||
var selectedValue, f;
|
||||
selectedValue = this.suggestions[i];
|
||||
if (selectedValue) {
|
||||
this.el.val(selectedValue);
|
||||
if (this.options.autoSubmit) {
|
||||
f = this.el.parents('form');
|
||||
if (f.length > 0) { f.get(0).submit(); }
|
||||
}
|
||||
this.ignoreValueChange = true;
|
||||
this.hide();
|
||||
this.onSelect(i);
|
||||
}
|
||||
},
|
||||
|
||||
change: function (i) {
|
||||
var selectedValue, fn, me;
|
||||
me = this;
|
||||
selectedValue = this.suggestions[i];
|
||||
if (selectedValue) {
|
||||
var s, d;
|
||||
s = me.suggestions[i];
|
||||
d = me.data[i];
|
||||
me.el.val(me.getValue(s));
|
||||
}
|
||||
else {
|
||||
s = '';
|
||||
d = -1;
|
||||
}
|
||||
|
||||
fn = me.options.onChange;
|
||||
if ($.isFunction(fn)) { fn(s, d, me.el); }
|
||||
},
|
||||
|
||||
moveUp: function () {
|
||||
if (this.selectedIndex === -1) { return; }
|
||||
if (this.selectedIndex === 0) {
|
||||
this.container.children().get(0).className = '';
|
||||
this.selectedIndex = -1;
|
||||
this.el.val(this.currentValue);
|
||||
return;
|
||||
}
|
||||
this.adjustScroll(this.selectedIndex - 1);
|
||||
},
|
||||
|
||||
moveDown: function () {
|
||||
if (this.selectedIndex === (this.suggestions.length - 1)) { return; }
|
||||
this.adjustScroll(this.selectedIndex + 1);
|
||||
},
|
||||
|
||||
adjustScroll: function (i) {
|
||||
var activeItem, offsetTop, upperBound, lowerBound;
|
||||
activeItem = this.activate(i);
|
||||
offsetTop = activeItem.offsetTop;
|
||||
upperBound = this.container.scrollTop();
|
||||
lowerBound = upperBound + this.options.maxHeight - 25;
|
||||
if (offsetTop < upperBound) {
|
||||
this.container.scrollTop(offsetTop);
|
||||
} else if (offsetTop > lowerBound) {
|
||||
this.container.scrollTop(offsetTop - this.options.maxHeight + 25);
|
||||
}
|
||||
this.el.val(this.getValue(this.suggestions[i]));
|
||||
},
|
||||
|
||||
onSelect: function (i) {
|
||||
var me, fn, s, d;
|
||||
me = this;
|
||||
fn = me.options.onSelect;
|
||||
s = me.suggestions[i];
|
||||
d = me.data[i];
|
||||
me.el.val(me.getValue(s));
|
||||
if ($.isFunction(fn)) { fn(s, d, me.el); }
|
||||
},
|
||||
|
||||
getValue: function (value) {
|
||||
var del, currVal, arr, me;
|
||||
me = this;
|
||||
del = me.options.delimiter;
|
||||
if (!del) { return value; }
|
||||
currVal = me.currentValue;
|
||||
arr = currVal.split(del);
|
||||
if (arr.length === 1) { return value; }
|
||||
return currVal.substr(0, currVal.length - arr[arr.length - 1].length) + value;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} (jQuery));
|
||||
|
|
@ -402,6 +402,11 @@
|
|||
var $notify = $('[layout="notify"]');
|
||||
$('h1', $notify).text(message.title);
|
||||
$('p', $notify).text(message.text);
|
||||
if (message.detail) {
|
||||
$('div', $notify).html(message.detail).show();
|
||||
} else {
|
||||
$('div', $notify).hide();
|
||||
}
|
||||
$notify.show();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ label {
|
|||
.notify {
|
||||
background-color: $color8;
|
||||
color:#000;
|
||||
overflow:auto;
|
||||
}
|
||||
.notify a {
|
||||
color:#000;
|
||||
|
|
@ -273,6 +274,47 @@ label {
|
|||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* Invitations */
|
||||
#invitation-controls {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
.invitation {
|
||||
margin: 1px;
|
||||
background: $color8;
|
||||
color:#000;
|
||||
padding: 3px;
|
||||
width:auto;
|
||||
float:left;
|
||||
}
|
||||
|
||||
.invitation span {
|
||||
font-size:85%;
|
||||
font-weight:bold;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
/* Autocomplete */
|
||||
.autocomplete {
|
||||
border:1px solid #999;
|
||||
background:$color8;
|
||||
color:#000;
|
||||
cursor:default;
|
||||
text-align:left;
|
||||
max-height:350px;
|
||||
overflow:auto;
|
||||
margin:-6px 6px 6px -6px;
|
||||
/* IE6 specific: */ _height:350px;
|
||||
_margin:0;
|
||||
_overflow-x:hidden;
|
||||
}
|
||||
|
||||
.autocomplete .selected { background:#F0F0F0; }
|
||||
|
||||
.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
|
||||
|
||||
.autocomplete strong { font-weight:normal; color:#3399FF; }
|
||||
|
||||
/* Session Tracks */
|
||||
.session-track {
|
||||
width: 125px;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ class ApiMusicSessionsController < ApiController
|
|||
@music_session.description = params[:description]
|
||||
@music_session.musician_access = params[:musician_access]
|
||||
genres = params[:genres]
|
||||
logger.debug "Genres class: " + genres.class.to_s()
|
||||
|
||||
unless genres.nil?
|
||||
genres.each do |genre_id|
|
||||
|
|
@ -45,6 +46,7 @@ class ApiMusicSessionsController < ApiController
|
|||
|
||||
@connection = Connection.find_by_client_id(client_id)
|
||||
tracks = params[:tracks]
|
||||
logger.debug "Tracks class: " + tracks.class.to_s()
|
||||
|
||||
associate_tracks(@connection, tracks)
|
||||
|
||||
|
|
@ -153,8 +155,13 @@ class ApiMusicSessionsController < ApiController
|
|||
|
||||
private
|
||||
def associate_tracks(connection, tracks)
|
||||
logger.debug "Tracks:"
|
||||
logger.debug tracks
|
||||
unless tracks.nil?
|
||||
#tracks.each_pair do |index,track|
|
||||
tracks.each do |track|
|
||||
logger.debug "Track"
|
||||
logger.debug track
|
||||
instrument = Instrument.find(track["instrument_id"])
|
||||
connection_track = ConnectionTrack.new
|
||||
connection_track.instrument = instrument
|
||||
|
|
|
|||
|
|
@ -118,32 +118,6 @@
|
|||
</label>
|
||||
</div>
|
||||
|
||||
<div class="formrow">
|
||||
<label>Musician Access
|
||||
<label>
|
||||
<input type="radio" name="musician_access"/>
|
||||
Public
|
||||
</label>
|
||||
<label>
|
||||
<input type="radio" name="musician_access"/>
|
||||
Private
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="formrow">
|
||||
<label>Musician Access Method
|
||||
<label>
|
||||
<input type="radio" name="musician_access_method"/>
|
||||
By Request/Approval
|
||||
</label>
|
||||
<label>
|
||||
<input type="radio" name="musician_access_method"/>
|
||||
Open
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="formrow">
|
||||
<label>Fan Access
|
||||
<label>
|
||||
|
|
@ -189,18 +163,27 @@
|
|||
<input type="text" class="hidden"/>
|
||||
</div>
|
||||
|
||||
<div class="formrow">
|
||||
<label>Tracks (TODO! - hardcoded in form handler)
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="formrow">
|
||||
<label>Session Description</label>
|
||||
<textarea name="description"></textarea>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="formrow">
|
||||
<label>Musician Invitations
|
||||
<input type="text"/>
|
||||
</label>
|
||||
<div id="added-invitations"></div>
|
||||
<div id="invitation-controls">
|
||||
<label>Musician Invitations
|
||||
<input id="invitations" type="text"/>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!--
|
||||
<div class="formrow">
|
||||
<label>Fan Invitations
|
||||
<label>
|
||||
|
|
@ -232,6 +215,11 @@
|
|||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Added Invitation Template -->
|
||||
<script type="text/template" id="template-added-invitation">
|
||||
<div class="invitation" user-id="{userId}">{userName} <span>X</span></div>
|
||||
</script>
|
||||
|
||||
<!-- Genre option template -->
|
||||
<script type="text/template" id="template-genre-option">
|
||||
<option value="{value}">{label}</option>
|
||||
|
|
@ -447,6 +435,7 @@
|
|||
<h1>Notification Popup</h1>
|
||||
<a layout-action="close">Close</a>
|
||||
<p></p>
|
||||
<div></div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
|
|
|||
Loading…
Reference in New Issue