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

240 lines
9.5 KiB
JavaScript

(function(context,$) {
"use strict";
context.JK = context.JK || {};
context.JK.RecordingFinishedDialog = function(app) {
var logger = context.JK.logger;
var rest = context.JK.Rest();
var playbackControls = null;
var recording = null; // deferred object
function resetForm() {
// remove all display errors
$('#recording-finished-dialog form .error-text').remove()
$('#recording-finished-dialog form .error').removeClass("error")
}
function beforeShow() {
if(recording == null) {
alert("recording data should not be null");
app.layout.closeDialog('recordingFinished');
return false;
}
resetForm();
var parentSelector = '#recording-finished-dialog div.genre-selector';
context.JK.GenreSelectorHelper.render(parentSelector);
// preset genre from 1st genre in current session
var currentOrLastSession = JK.CurrentSessionModel.getCurrentOrLastSession();
if(currentOrLastSession && currentOrLastSession.genres.length > 0) {
var genreDescription = currentOrLastSession.genres[0];
context.JK.GenreSelectorHelper.setSelectedGenres(parentSelector, [genreDescription]);
}
var localResults = context.jamClient.GetLocalRecordingState({recordings: [recording]});
if(localResults['error']) {
app.notify({
title : "Unable to Open Recording for Playback",
text : localResults['error'],
icon_url: "/assets/content/icon_alert_big.png"
});
}
else {
var localResult = localResults.recordings[0];
if(localResult.aggregate_state == 'MISSING') {
app.notify({
title : "Unable to Open Recording for Playback",
text : "All tracks associated with the recording are missing",
icon_url: "/assets/content/icon_alert_big.png"
});
}
else if(localResult.aggregate_state == 'PARTIALLY_MISSING') {
app.notify({
title : "Unable to Open Recording for Playback",
text: "Some tracks associated with the recording are missing",
icon_url: "/assets/content/icon_alert_big.png"
})
}
else {
// load recording
var openRecordingResult = context.jamClient.OpenRecording(recording);
logger.debug("OpenRecording response: %o", openRecordingResult);
if(openRecordingResult.error) {
app.notify({
"title": "Can't Open Recording",
"text": openRecordingResult.error,
"icon_url": "/assets/content/icon_alert_big.png"
});
}
playbackControls.startMonitor();
}
}
}
function afterHide() {
recording = null;
playbackControls.stopMonitor();
context.jamClient.CloseRecording();
}
function discardRecording(e) {
resetForm();
registerDiscardRecordingHandlers(false);
rest.discardRecording({
id: recording.id
})
.done(function() {
console.error("recording discarded by user. recordingId=%o", recording.id);
})
.fail(function(jqXHR){
console.error("recording discard by user failed. recordingId=%o. reason: %o", recording.id, jqXHR.responseText);
})
.always(function() {
app.layout.closeDialog('recordingFinished')
registerDiscardRecordingHandlers(true);
})
return false;
}
function claimRecording(e){
resetForm();
registerClaimRecordingHandlers(false);
var name = $('#recording-finished-dialog form input[name=name]').val();
var description = $('#recording-finished-dialog form textarea[name=description]').val();
var genre = $('#recording-finished-dialog form select[name=genre]').val();
var is_public = $('#recording-finished-dialog form input[name=is_public]').is(':checked')
var is_downloadable = $('#recording-finished-dialog form input[name=is_downloadable]').is(':checked');
rest.claimRecording({
id : recording.id,
name: name,
description: description,
genre: genre,
is_public: is_public,
is_downloadable: is_downloadable
})
.done(function() {
app.layout.closeDialog('recordingFinished')
})
.fail(function(jqXHR) {
if(jqXHR.status == 422) {
var errors = JSON.parse(jqXHR.responseText);
var $name_errors = context.JK.format_errors('name', errors);
if($name_errors) $('#recording-finished-dialog form input[name=name]').closest('div.field').addClass('error').end().after($name_errors);
var $description_errors = context.JK.format_errors('description', errors);
if($description_errors) $('#recording-finished-dialog form input[name=description]').closest('div.field').addClass('error').end().after($description_errors);
var $genre_errors = context.JK.format_errors('genre', errors);
if($genre_errors) $('#recording-finished-dialog form select[name=genre]').closest('div.field').addClass('error').end().after($genre_errors);
var $is_public_errors = context.JK.format_errors('is_public', errors);
if($is_public_errors) $('#recording-finished-dialog form input[name=is_public]').closest('div.field').addClass('error').end().after($is_public_errors);
var $is_downloadable_errors = context.JK.format_errors('is_downloadable', errors);
if($is_downloadable_errors) $('#recording-finished-dialog form input[name=is_downloadable]').closest('div.field').addClass('error').end().after($is_downloadable_errors);
var recording_error = context.JK.get_first_error('recording_id', errors);
if (recording_error) context.JK.showErrorDialog(app, "Unable to claim recording.", recording_error);
}
else {
logger.error("unable to claim recording %o", arguments);
context.JK.showErrorDialog(app, "Unable to claim recording.", jqXHR.responseText);
}
})
.always(function() {
registerClaimRecordingHandlers(true);
});
return false;
}
function registerClaimRecordingHandlers(onOff) {
if(onOff) {
$('#keep-session-recording').on('click', claimRecording);
$('#recording-finished-dialog form').on('submit', claimRecording);
}
else {
$('#keep-session-recording').off('click', claimRecording)
$('#recording-finished-dialog form').off('submit', claimRecording);
}
}
function registerDiscardRecordingHandlers(onOff) {
if(onOff) {
$('#discard-session-recording').on('click', discardRecording);
}
else {
$('#discard-session-recording').off('click', discardRecording);
}
}
function onPause() {
logger.debug("calling jamClient.SessionStopPlay");
context.jamClient.SessionStopPlay();
}
function onPlay(e, data) {
logger.debug("calling jamClient.SessionStartPlay");
context.jamClient.SessionStartPlay(data.playbackMode);
}
function onChangePlayPosition(e, data) {
logger.debug("calling jamClient.SessionTrackSeekMs(" + data.positionMs + ")");
context.jamClient.SessionTrackSeekMs(data.positionMs);
}
function registerStaticEvents() {
registerClaimRecordingHandlers(true);
registerDiscardRecordingHandlers(true);
$(playbackControls)
.on('pause', onPause)
.on('play', onPlay)
.on('change-position', onChangePlayPosition);
}
function setRecording(recordingData) {
if(recording != null) {
//XXX - prevent start/stop recording mashing; protect this dialog
logger.error("unable to set recording data over existing recording data. this coudld be due to start/stop recording mashing");
return;
}
recording = recordingData;
}
function initialize(){
var dialogBindings = {
'beforeShow' : beforeShow,
'afterHide': afterHide
};
app.bindDialog('recordingFinished', dialogBindings);
playbackControls = new context.JK.PlaybackControls($('#recording-finished-dialog .recording-controls'));
registerStaticEvents();
};
this.initialize = initialize;
this.setRecording = setRecording;
}
return this;
})(window,jQuery);