/* global I18n HelperModule animateSpinner RepositoryListColumnType RepositoryStatusColumnType*/
/* eslint-disable no-restricted-globals */
var RepositoryColumns = (function() {
var manageModal = '#manage-repository-column';
function initColumnTypeSelector() {
var $manageModal = $(manageModal);
$manageModal.off('change', '#repository-column-data-type').on('change', '#repository-column-data-type', function() {
$('.column-type').hide();
$('[data-column-type="' + $(this).val() + '"]').show();
});
}
function removeElementFromDom(column) {
$('.repository-column-edtior .list-group-item[data-id="' + column.id + '"]').remove();
if ($('.list-group-item').length === 0) {
location.reload();
}
}
function initDeleteSubmitAction() {
var $manageModal = $(manageModal);
$manageModal.off('click', '#delete-repo-column-submit').on('click', '#delete-repo-column-submit', function() {
animateSpinner();
$manageModal.modal('hide');
$.ajax({
url: $(this).data('delete-url'),
type: 'DELETE',
dataType: 'json',
success: (result) => {
removeElementFromDom(result);
HelperModule.flashAlertMsg(result.message, 'success');
animateSpinner(null, false);
},
error: (result) => {
animateSpinner(null, false);
HelperModule.flashAlertMsg(result.responseJSON.error, 'danger');
}
});
});
}
function checkData() {
var validators = {
RepositoryListValue: 'RepositoryListColumnType',
RepositoryStatusValue: 'RepositoryStatusColumnType'
};
var currentPartial = $('#repository-column-data-type').find(':selected').val();
if (validators[currentPartial]) {
return eval(validators[currentPartial])
.checkValidation();
}
return true;
}
function insertNewListItem(column) {
var attributes = column.attributes;
var html = `
${attributes.name}
`;
// remove element if already persent
$('[data-id="' + column.id + '"]').remove();
$(html).insertBefore('.repository-columns-body ul li:first');
// remove 'no column' list item
$('[data-attr="no-columns"]').remove();
}
function updateListItem(column) {
var name = column.attributes.name;
$('li[data-id=' + column.id + ']').find('span').first().text(name);
}
function loadSpecificParams(type, params, modal) {
var $modal = modal;
var newParams = params;
var $statusItems;
if (type === 'RepositoryListValue') {
newParams.repository_column.repository_list_items_attributes = JSON.parse($('#dropdown_options').val());
newParams.repository_column.delimiter = $('select#delimiter').data('used-delimiter');
} else if (type === 'RepositoryStatusValue') {
$statusItems = $modal.find('.status-item-container');
// Load all new items
// Load all existing items, delete flag included
newParams.repository_column.repository_status_items_attributes = [];
$.each($statusItems, function(index, value) {
var $item = $(value);
var id = $item.data('id');
var removed = $item.data('removed');
var icon = $item.find('.status-item-icon').data('icon');
var status = $item.find('input.status-item-field').val();
if (removed && id) { // flag as item for removing
newParams.repository_column.repository_status_items_attributes
.push({ id: id, _destroy: true });
} else if (id) { // existing element, maybe values needs to be updated
newParams.repository_column.repository_status_items_attributes
.push({ id: id, icon: icon, status: status });
} else { // new element
newParams.repository_column.repository_status_items_attributes
.push({ icon: icon, status: status });
}
});
}
return newParams;
}
function initCreateSubmitAction() {
var $manageModal = $(manageModal);
$manageModal.off('click', '#new-repo-column-submit').on('click', '#new-repo-column-submit', function() {
var url = $('#repository-column-data-type').find(':selected').data('create-url');
var params = { repository_column: { name: $('#repository-column-name').val() } };
var selectedType = $('#repository-column-data-type').find(':selected').val();
params = loadSpecificParams(selectedType, params, $manageModal);
// if (checkData() === false) return;
$.ajax({
url: url,
type: 'POST',
data: JSON.stringify(params),
contentType: 'application/json',
success: function(result) {
var data = result.data;
insertNewListItem(data);
HelperModule.flashAlertMsg(data.attributes.message, 'success');
$manageModal.modal('hide');
},
error: function(error) {
$('#new-repository-column').renderFormErrors('repository_column', error.responseJSON.repository_column, true);
}
});
});
}
function initEditSubmitAction() {
var $manageModal = $(manageModal);
$manageModal.off('click', '#update-repo-column-submit').on('click', '#update-repo-column-submit', function() {
var url = $('#repository-column-data-type').find(':selected').data('edit-url');
var params = { repository_column: { name: $('#repository-column-name').val() } };
var selectedType = $('#repository-column-data-type').find(':selected').val();
params = loadSpecificParams(selectedType, params, $manageModal);
if (checkData() !== true) return;
$.ajax({
url: url,
type: 'PUT',
data: JSON.stringify(params),
dataType: 'json',
contentType: 'application/json',
success: function(result) {
var data = result.data;
updateListItem(data);
HelperModule.flashAlertMsg(data.attributes.message, 'success');
$manageModal.modal('hide');
},
error: function(error) {
$('#new-repository-column').renderFormErrors('repository_column', error.responseJSON.repository_column, true);
}
});
});
}
function initManageColumnModal() {
var $manageModal = $(manageModal);
$('.repository-column-edtior').off('click', '.manage-repo-column').on('click', '.manage-repo-column', function() {
var button = $(this);
var modalUrl = button.data('modal-url');
var columnType;
$.get(modalUrl, (data) => {
$manageModal.modal('show').find('.modal-content').html(data.html)
.find('#repository-column-name')
.focus();
$manageModal.trigger('columnModal::partialLoadedForLists');
$manageModal.trigger('columnModal::partialLoadedForStatuses');
if (button.data('action') === 'new') {
$('[data-column-type="RepositoryTextValue"]').show();
$('#new-repo-column-submit').show();
} else {
columnType = $('#repository-column-data-type').find(':selected').val();
$('#update-repo-column-submit').show();
$('[data-column-type=' + columnType + ']').show();
}
}).fail(function() {
HelperModule.flashAlertMsg(I18n.t('libraries.repository_columns.no_permissions'), 'danger');
});
});
}
return {
init: () => {
if ($('.repository-columns-header').length > 0) {
initColumnTypeSelector();
initEditSubmitAction();
initCreateSubmitAction();
initDeleteSubmitAction();
initManageColumnModal();
RepositoryListColumnType.init();
RepositoryStatusColumnType.init();
}
}
};
}());
$(document).on('turbolinks:load', function() {
RepositoryColumns.init();
});