mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-18 23:21:30 +08:00
125 lines
4 KiB
JavaScript
125 lines
4 KiB
JavaScript
/* globals renderFormError animateSpinner */
|
|
|
|
(function() {
|
|
function clearModal(id) {
|
|
// Completely remove modal when it gets closed
|
|
$(id).on('hidden.bs.modal', function() {
|
|
$(id).remove();
|
|
});
|
|
}
|
|
|
|
// Reload after successfully updated experiment
|
|
function validateExperimentForm(element) {
|
|
if ($(element)) {
|
|
let form = $(element).find('form');
|
|
form.on('ajax:success', function(e, data) {
|
|
animateSpinner(form, true);
|
|
if (element.match(/#new-experiment-modal/)) {
|
|
window.location.replace(data.path);
|
|
} else {
|
|
location.reload();
|
|
}
|
|
}).on('ajax:error', function(e, error) {
|
|
let msg = JSON.parse(error.responseText);
|
|
if ('name' in msg) {
|
|
renderFormError(e, $(element).find('#experiment-name'), msg.name.toString(), true);
|
|
} else if ('description' in msg) {
|
|
renderFormError(e, $(element).find('#experiment-description'), msg.description.toString(), true);
|
|
} else {
|
|
renderFormError(e, $(element).find('#experiment-name'), error.statusText, true);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Validates move action
|
|
function validateMoveModal(modal) {
|
|
if (modal.match(/#move-experiment-modal-[0-9]*/)) {
|
|
let form = $(modal).find('form');
|
|
form.on('ajax:success', function(e, data) {
|
|
animateSpinner(form, true);
|
|
window.location.replace(data.path);
|
|
}).on('ajax:error', function(e, error) {
|
|
form.clearFormErrors();
|
|
let msg = JSON.parse(error.responseText);
|
|
renderFormError(e, form.find('#experiment_project_id'), msg.message.toString());
|
|
});
|
|
}
|
|
}
|
|
|
|
// Create ajax hook on given 'element', which should return modal with 'id' =>
|
|
// show that modal
|
|
function initializeModal(element, id) {
|
|
// Initialize new experiment modal listener
|
|
$(element).on('ajax:beforeSend', function() {
|
|
animateSpinner();
|
|
}).on('ajax:success', function(e, data) {
|
|
$('body').append($.parseHTML(data.html));
|
|
$(id).modal('show', {
|
|
backdrop: true,
|
|
keyboard: false
|
|
});
|
|
validateMoveModal(id);
|
|
clearModal($(id));
|
|
validateExperimentForm(id);
|
|
}).on('ajax:error', function() {
|
|
animateSpinner(null, false);
|
|
// TODO
|
|
}).on('ajax:complete', function() {
|
|
animateSpinner(null, false);
|
|
$(id).find('.selectpicker').selectpicker();
|
|
});
|
|
}
|
|
|
|
// Initialize dropdown actions on experiment:
|
|
// - edit
|
|
// - clone
|
|
function initializeDropdownActions() {
|
|
// { buttonClass: modalName } mappings
|
|
// click on buttonClass summons modalName dialog
|
|
let modals = {
|
|
'.edit-experiment': '#edit-experiment-modal-',
|
|
'.clone-experiment': '#clone-experiment-modal-',
|
|
'.move-experiment': '#move-experiment-modal-'
|
|
};
|
|
|
|
$.each($('.dropdown-experiment-actions'), function() {
|
|
var $dropdown = $(this);
|
|
$.each(modals, function(buttonClass, modalName) {
|
|
var id = modalName + $dropdown.data('id');
|
|
initializeModal($dropdown.find(buttonClass), id);
|
|
});
|
|
});
|
|
}
|
|
|
|
// Initialize no description edit link
|
|
function initEditNoDescription() {
|
|
var modal = '#edit-experiment-modal-';
|
|
$.each($('.experiment-no-description'), function() {
|
|
var id = modal + $(this).data('id');
|
|
initializeModal($(this), id);
|
|
});
|
|
}
|
|
|
|
// Bind modal to new-experiment action
|
|
initializeModal($('#new-experiment'), '#new-experiment-modal');
|
|
|
|
// Bind modal to big-plus new experiment actions
|
|
initializeModal('.big-plus', '#new-experiment-modal');
|
|
|
|
// Bind modal to new-exp-title action
|
|
initializeModal('.new-exp-title', '#new-experiment-modal');
|
|
|
|
// Bind modals to all clone-experiment actions
|
|
$.each($('.clone-experiment'), function() {
|
|
var id = $(this).closest('.experiment-panel').data('id');
|
|
initializeModal($(this), '#clone-experiment-modal-' + id);
|
|
});
|
|
|
|
// Bind modal to all actions listed on dropdown accesible from experiment
|
|
// panel
|
|
initializeDropdownActions();
|
|
|
|
// init
|
|
initEditNoDescription();
|
|
}());
|