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

125 lines
4.8 KiB
JavaScript

/**
* Javascript for the session settings dialog.
*/
(function(context,$) {
context.JK = context.JK || {};
context.JK.SessionSettingsDialog = function(app, sessionScreen) {
var logger = context.JK.logger;
var $dialog;
var rest = new JK.Rest();
function beforeShow(data) {
context.JK.GenreSelectorHelper.render('#session-settings-genre');
$dialog = $('[layout-id="session-settings"]');
var currentSession = sessionScreen.getCurrentSession();
context.JK.GenreSelectorHelper.setSelectedGenres('#session-settings-genre', currentSession.genres);
// dynamic object binding to form.
// TODO: Generalize, test and bundle with formToObject
// It's the other direction... given an objects -- set the form's
// inputs/values to the corresponding object properties.
var skip = [
'band_id', // not used
'user_id', // not used
'participants', // has its own API
'invitations', // has its own API
'join_requests', // has its own API
'genres' // handled specifically
];
var radioButtons = [
'approval_required',
'fan_chat'
];
$.each(_.keys(currentSession), function(index,propName) {
if (context._.contains(skip, propName)) {
return true; // "continue"
}
var isRadio = (context._.contains(radioButtons, propName));
var desiredValue = null;
if ($.isArray(currentSession[propName])) {
desiredValue = currentSession[propName].join(',');
} else {
desiredValue = currentSession[propName];
}
desiredValue = String(desiredValue);
var inputSelector = '[name="' + propName + '"]';
var $input = [];
// radio buttons must be handled differently
if (isRadio) {
inputSelector += '[value="' + desiredValue + '"]';
$(inputSelector).removeAttr('checked');
$input = $(inputSelector, $dialog);
$input.prop('checked', true).change();
} else {
$input = $(inputSelector, $dialog);
$input.val(desiredValue).change();
}
if($input.is('select')) {
context.JK.dropdown($input);
}
});
}
function musicianAccessChanged(evt) {
$dialog = $('[layout-id="session-settings"]');
var hasMusicianAccess = $('select[name="musician_access"]', $dialog).val(); // string
hasMusicianAccess = context.JK.stringToBool(hasMusicianAccess);
if (hasMusicianAccess) {
$('input[name="approval_required"]', $dialog).removeAttr("disabled");
} else {
$('input[name="approval_required"]', $dialog).attr("disabled", "disabled");
}
}
function fanAccessChanged(evt) {
$dialog = $('[layout-id="session-settings"]');
var hasFanAccess = $('select[name="fan_access"]', $dialog).val(); // string
hasFanAccess = context.JK.stringToBool(hasFanAccess);
if (hasFanAccess) {
$('input[name="fan_chat"]', $dialog).removeAttr("disabled");
} else {
$('input[name="fan_chat"]', $dialog).attr("disabled", "disabled");
}
}
function saveSettings(evt) {
var newSessionInfo = $('#session-settings-dialog').formToObject();
var id = newSessionInfo.id;
delete newSessionInfo.id;
if (typeof newSessionInfo.genres === "string") {
newSessionInfo.genres = [newSessionInfo.genres];
}
rest.updateSession(id, newSessionInfo).done(settingsSaved);
}
function settingsSaved(response) {
// No response returned from this call. 204.
sessionScreen.refreshCurrentSession(true);
app.layout.closeDialog('session-settings');
}
function events() {
$('#session-settings-dialog-submit').on('click', saveSettings);
$('#session-settings-dialog select[name="fan_access"]').on('change', fanAccessChanged);
$('#session-settings-dialog select[name="musician_access"]').on('change', musicianAccessChanged);
}
this.initialize = function() {
events();
var dialogBindings = {
'beforeShow': beforeShow
};
app.bindDialog('session-settings', dialogBindings);
};
};
})(window,jQuery);