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

170 lines
5.0 KiB
JavaScript

(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.EditRecordingDialog = function (app) {
var logger = context.JK.logger;
var rest = context.JK.Rest();
var claimedRecordingId = null;
var $dialog = null;
var $form = null;
var $name = null;
var $description = null;
var $genre = null;
var $isPublic = null;
var $cancelBtn = null;
var $saveBtn = null;
var $deleteBtn = null;
var updating = false;
var deleting = false;
function resetForm() {
// remove all display errors
$dialog.find('.error-text').remove()
$dialog.find('.error').removeClass("error")
}
function beforeShow(args) {
claimedRecordingId = args.d1;
if(!claimedRecordingId) throw "claimedRecordingId must be specified";
resetForm();
rest.getClaimedRecording(claimedRecordingId)
.done(function(data) {
var name = data.name;
var description = data.description;
var is_public = data.is_public;
var genre_id = data.genre_id;
context.JK.GenreSelectorHelper.setSelectedGenres($genre.parent(), [genre_id]);
$name.val(name);
$description.val(description);
if(is_public) {
$isPublic.attr('checked', 'checked').iCheck('check')
}
else {
$isPublic.removeAttr('checked').iCheck('uncheck')
}
})
.fail(app.ajaxError)
}
function afterHide() {
}
function attemptUpdate() {
if(updating) return;
updating = true;
var name = $name.val();
var description = $description.val();
var genre = $genre.val();
var is_public = $isPublic.is(':checked');
rest.updateClaimedRecording({id: claimedRecordingId, name: name, description: description, is_public: is_public, genre: genre })
.done(function(updated) {
resetForm();
$dialog.triggerHandler('recording_updated', {id: claimedRecordingId, name: name, description: description, is_public: is_public, genre: genre})
app.layout.closeDialog('edit-recording');
})
.fail(function(jqXHR) {
if(jqXHR.status = 422) {
// highlight fields in error
resetForm();
var errors = JSON.parse(jqXHR.responseText);
var $name_errors = context.JK.format_errors('name', errors);
if ($name_errors) $name.closest('div.field').addClass('error').end().after($name_errors);
var $description_errors = context.JK.format_errors('description', errors);
if ($description_errors) $description.closest('div.field').addClass('error').end().after($description_errors);
var $genre_errors = context.JK.format_errors('genre', errors);
if ($genre_errors) $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) $isPublic.closest('div.field').addClass('error').end().after($is_public_errors);
}
else {
app.ajaxError(arguments);
}
})
.always(function() {
updating = false;
})
}
function attemptDelete() {
if(deleting) return;
deleting = true;
context.JK.Banner.showYesNo({
title: "Confirm Deletion",
html: "Are you sure you want to delete this recording?",
yes: function() {
rest.deleteClaimedRecording(claimedRecordingId)
.done(function() {
$dialog.triggerHandler('recording_deleted', {id: claimedRecordingId});
app.layout.closeDialog('edit-recording');
})
.fail(app.ajaxError)
.always(function() {
deleting = false;
})
},
no : function() {
context.JK.Banner.hide();
deleting = false;
}
})
}
function cancel() {
app.layout.closeDialog('edit-recording');
}
function events() {
$saveBtn.click(attemptUpdate);
$deleteBtn.click(attemptDelete);
$cancelBtn.click(cancel)
$form.submit(false);
}
function initialize() {
var dialogBindings = {
'beforeShow': beforeShow,
'afterHide': afterHide
};
app.bindDialog('edit-recording', dialogBindings);
$dialog = $('#edit-recording-dialog');
$form = $dialog.find('form');
$cancelBtn = $dialog.find('.cancel-btn');
$saveBtn = $dialog.find('.save-btn');
$deleteBtn = $dialog.find('.delete-btn');
$name = $dialog.find('input[name="name"]');
$description = $dialog.find('textarea[name="description"]');
$genre = $dialog.find('select[name=genre]');
$isPublic = $dialog.find('input[name=is_public]');
events();
context.JK.GenreSelectorHelper.render($genre.parent());
context.JK.checkbox($isPublic);
};
this.initialize = initialize;
}
})(window, jQuery);