jam-cloud/web/app/assets/javascripts/inviteMusicians.js

251 lines
9.3 KiB
JavaScript
Raw Permalink Normal View History

2014-01-13 16:11:26 +00:00
(function(context,$) {
"use strict";
context.JK = context.JK || {};
2014-01-14 06:12:00 +00:00
context.JK.InviteMusiciansUtil = function(app) {
2014-01-13 16:11:26 +00:00
var logger = context.JK.logger;
var userNames = [];
var userIds = [];
var userPhotoUrls = [];
var friendSelectorDialog = null;
2014-01-14 08:29:07 +00:00
var invitedFriends = [];
2014-06-04 15:15:12 +00:00
var invitedFriendNames = [];
var existingInvites = [];
2014-01-13 16:11:26 +00:00
var autoComplete = null;
var rest = context.JK.Rest();
var inviteAction = 'create'; // create/update
var friendInput = null;
2014-01-14 08:29:07 +00:00
var updateSessionID = null;
var addInstructions = '';
2014-03-13 09:23:22 +00:00
function _initInvite(elemSelector, iAction, instructions) {
addInstructions = instructions;
inviteAction = iAction;
friendInput = '#friend-input-'+inviteAction;
_appendFriendSelector($(elemSelector));
return friendInput;
}
2014-03-13 09:23:22 +00:00
this.inviteSessionCreate = function(elemSelector, instructions) {
return _initInvite(elemSelector, 'create', instructions)
};
2014-03-13 09:23:22 +00:00
this.inviteBandCreate = function(elemSelector, instructions) {
return _initInvite(elemSelector, 'band', instructions)
2014-03-10 15:14:12 +00:00
};
this.inviteSessionUpdate = function(elemSelector, sessionId) {
2014-01-14 08:29:07 +00:00
this.clearSelections();
updateSessionID = sessionId;
friendSelectorDialog.setCallback(friendSelectorCallback);
inviteAction = 'update';
2014-08-12 04:24:57 +00:00
friendInput = '#friend-input-' + inviteAction;
if (0 == $(elemSelector + ' .friendbox').length) {
_appendFriendSelector($(elemSelector));
}
2014-08-12 04:24:57 +00:00
$('#btn-save-invites').unbind('click');
$('#btn-save-invites').click(function() {
createInvitations(updateSessionID);
2014-08-12 04:24:57 +00:00
app.layout.closeDialog('select-invites');
});
$.ajax({
url: "/api/invitations",
data: { session_id: sessionId, sender: context.JK.currentUserId }
}).done(function(response) {
response.map(function(item) {
var dd = item['receiver'];
existingInvites.push(dd.id);
addInvitation(dd.name, dd.id);
});
}).fail(app.ajaxError);
return friendInput;
}
2014-01-13 16:11:26 +00:00
2014-01-14 04:33:32 +00:00
this.clearSelections = function() {
2014-01-13 16:11:26 +00:00
userNames = [];
userIds = [];
userPhotoUrls = [];
2014-01-14 08:29:07 +00:00
invitedFriends = [];
2014-06-04 15:15:12 +00:00
invitedFriendNames = [];
existingInvites = [];
2014-01-14 08:29:07 +00:00
updateSessionID = null;
2014-01-14 04:33:32 +00:00
$('.selected-friends').empty();
$(friendInput).val('');
2014-01-14 04:33:32 +00:00
};
2014-01-13 16:11:26 +00:00
2014-01-14 04:33:32 +00:00
this.loadFriends = function() {
2014-01-13 16:11:26 +00:00
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);
});
if (friendInput) {
var autoCompleteOptions = {
lookup: { suggestions: userNames, data: userIds },
onSelect: addInvitation,
serviceUrl: '/api/search.json?srch_sessinv=1',
minChars: 3,
autoSelectFirst: true
};
$(friendInput).attr("placeholder", "Type a friend\'s name").prop('disabled', false)
autoComplete = $(friendInput).autocomplete(autoCompleteOptions);
$(".autocomplete").width("150px");
}
2014-01-13 16:11:26 +00:00
})
.fail(function() {
$(friendInput).attr("placeholder", "Unable to lookup friends");
2014-01-13 16:11:26 +00:00
app.ajaxError(arguments);
});
}
function friendSelectorCallback(newSelections) {
var keys = Object.keys(newSelections);
for (var i=0; i < keys.length; i++) {
var dd = newSelections[keys[i]];
addInvitation(dd.userName, dd.userId);
2014-01-13 16:11:26 +00:00
}
}
function addInvitation(value, data) {
if (undefined === data) {
data = value.data;
value = value.value;
}
2014-01-14 08:29:07 +00:00
if (0 > invitedFriends.indexOf(data)) {
2014-01-13 16:11:26 +00:00
var template = $('#template-added-invitation').html();
var invitationHtml = context.JK.fillTemplate(template,
{userId: data,
userName: value});
$('.selected-friends').append(invitationHtml);
$(friendInput).select();
2014-01-14 08:29:07 +00:00
invitedFriends.push(data);
2014-06-04 15:15:12 +00:00
invitedFriendNames.push(value);
} else {
$(friendInput).select();
// context.alert('Invitation already exists for this musician.');
2014-01-13 16:11:26 +00:00
}
$(friendInput).val('');
2014-01-13 16:11:26 +00:00
}
2014-12-03 07:08:26 +00:00
this.addInvitationIfAbsent = addInvitation;
2014-06-01 18:45:17 +00:00
function getInvitedFriends() {
2014-06-09 22:13:54 +00:00
return invitedFriends;
2014-06-01 18:45:17 +00:00
}
this.getInvitedFriends = getInvitedFriends;
2014-06-09 22:13:54 +00:00
function getInvitedFriendNames() {
return invitedFriendNames;
}
this.getInvitedFriendNames = getInvitedFriendNames;
2014-01-13 16:11:26 +00:00
function removeInvitation(evt) {
2014-01-14 08:29:07 +00:00
var idx = invitedFriends.indexOf($(evt.currentTarget).parent().attr('user-id'));
2014-06-04 15:15:12 +00:00
if (0 <= idx) {
invitedFriends.splice(idx, 1);
invitedFriendNames.splice(idx, 1);
}
2014-01-13 16:11:26 +00:00
$(evt.currentTarget).closest('.invitation').remove();
}
2014-01-14 07:31:20 +00:00
function createInvitations(sessionId, onComplete) {
2014-01-13 16:11:26 +00:00
var callCount = 0;
var totalInvitations = invitedFriends.length;
2014-01-14 08:29:07 +00:00
invitedFriends.map(function(invite_id) {
callCount++;
var invite = {
music_session: sessionId,
receiver: invite_id
};
$.ajax({
type: "POST",
url: "/api/invitations",
data: invite
}).done(function(response) {
callCount--;
}).fail(app.ajaxError);
2014-01-13 16:11:26 +00:00
});
// TODO - this is the second time I've used this pattern.
// refactor to make a common utility for this.
function checker() {
2014-01-14 08:29:07 +00:00
callCount === 0 ? onComplete() : context.setTimeout(checker, 10);
2014-01-13 16:11:26 +00:00
}
2014-01-14 07:31:20 +00:00
if (onComplete) checker();
2014-01-13 16:11:26 +00:00
return totalInvitations;
}
2014-01-14 07:31:20 +00:00
this.createInvitations = createInvitations;
2014-01-13 16:11:26 +00:00
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 _friendSelectorHTML() {
var fInput = friendInput ? friendInput.substring(1,friendInput.length) : '';
return context.JK.fillTemplate($('#template-session-invite-musicians').html(),
2014-08-12 04:24:57 +00:00
{choose_friends_id: 'btn-choose-friends-' + inviteAction,
selected_friends_id: 'selected-friends-' + inviteAction,
friend_input: fInput,
2014-03-13 09:23:22 +00:00
instructions: addInstructions});
}
function _appendFriendSelector(elemSelector) {
elemSelector.append(_friendSelectorHTML());
2014-08-12 04:24:57 +00:00
$('#selected-friends-' + inviteAction).on("click", ".invitation a", removeInvitation);
$('#btn-choose-friends-' + inviteAction).click(function(){
2014-01-14 08:29:07 +00:00
var obj = {};
invitedFriends.map(function(uid) { obj[uid] = true; });
friendSelectorDialog.showDialog(obj);
});
if ('update' == inviteAction) {
$(friendInput).hide();
}
};
2014-01-13 16:11:26 +00:00
this.initialize = function(friendSelectorDialogInstance) {
friendSelectorDialog = friendSelectorDialogInstance;
return this;
2014-01-13 16:11:26 +00:00
};
return this;
};
})(window,jQuery);