180 lines
6.3 KiB
JavaScript
180 lines
6.3 KiB
JavaScript
$(function () {
|
||
var modalEl = document.getElementById('category-modal');
|
||
|
||
if (!modalEl) {
|
||
return;
|
||
}
|
||
|
||
var modal = new bootstrap.Modal(modalEl);
|
||
var $form = $('#category-form');
|
||
var $error = $('#category-form-error');
|
||
var archiveEl = document.getElementById('category-archive-modal');
|
||
var archiveModal = archiveEl ? new bootstrap.Modal(archiveEl) : null;
|
||
|
||
function filterParentOptions(type) {
|
||
$('#category-parent option[data-type]').each(function () {
|
||
var match = $(this).data('type') === type;
|
||
$(this).prop('hidden', !match).prop('disabled', !match);
|
||
});
|
||
|
||
var $selected = $('#category-parent option:selected');
|
||
if ($selected.data('type') && $selected.data('type') !== type) {
|
||
$('#category-parent').val('');
|
||
}
|
||
}
|
||
|
||
function toggleFormulaGroup(type) {
|
||
$('#category-formula-group').toggle(type === 'income');
|
||
}
|
||
|
||
function resetForm() {
|
||
$form[0].reset();
|
||
$form.find('[name=id]').val('');
|
||
$error.hide().text('');
|
||
}
|
||
|
||
$(document).on('click', '.js-category-add', function () {
|
||
var type = $(this).data('type');
|
||
|
||
resetForm();
|
||
$form.data('mode', 'create').attr('action', '/categories/create');
|
||
$('#category-modal-title').text(type === 'income' ? 'Новая статья дохода' : 'Новая статья расхода');
|
||
$('#category-type').val(type);
|
||
filterParentOptions(type);
|
||
toggleFormulaGroup(type);
|
||
modal.show();
|
||
});
|
||
|
||
$(document).on('click', '.js-category-edit', function (e) {
|
||
e.preventDefault();
|
||
|
||
var $row = $(this).closest('.category-row');
|
||
var type = $row.data('type');
|
||
|
||
resetForm();
|
||
$form.data('mode', 'edit').attr('action', '/categories/edit/' + $row.data('id'));
|
||
$form.find('[name=title]').val($row.data('title'));
|
||
$('#category-type').val(type);
|
||
$('#category-modal-title').text('Редактировать статью');
|
||
filterParentOptions(type);
|
||
$('#category-parent').val($row.data('parent_id') || '');
|
||
toggleFormulaGroup(type);
|
||
$('#category-linked').val($row.data('linked') || '');
|
||
$form.find('[name=formula_pct]').val($row.data('pct') || '');
|
||
modal.show();
|
||
});
|
||
|
||
$(document).on('click', '.js-category-archive-open', function () {
|
||
if (archiveModal) {
|
||
archiveModal.show();
|
||
}
|
||
});
|
||
|
||
$(document).on('click', '.js-category-restore', function () {
|
||
var $row = $(this).closest('.archive-row');
|
||
var csrf = $form.find('[name=csrf_token]').val();
|
||
|
||
$.post('/categories/restore/' + $row.data('id'), {csrf_token: csrf})
|
||
.done(function () {
|
||
window.location.reload();
|
||
})
|
||
.fail(function () {
|
||
window.alert('Не удалось восстановить статью');
|
||
});
|
||
});
|
||
|
||
$(document).on('click', '.js-category-delete', function (e) {
|
||
e.preventDefault();
|
||
|
||
var $row = $(this).closest('.category-row');
|
||
var title = $row.data('title');
|
||
var csrf = $form.find('[name=csrf_token]').val();
|
||
|
||
if (!window.confirm('Архивировать статью «' + title + '»?')) {
|
||
return;
|
||
}
|
||
|
||
$.post('/categories/delete/' + $row.data('id'), {csrf_token: csrf})
|
||
.done(function () {
|
||
window.location.reload();
|
||
})
|
||
.fail(function () {
|
||
window.alert('Не удалось архивировать статью');
|
||
});
|
||
});
|
||
|
||
$(document).on('submit', '#category-form', function (e) {
|
||
e.preventDefault();
|
||
$error.hide().text('');
|
||
|
||
$.post($form.attr('action'), $form.serialize())
|
||
.done(function () {
|
||
window.location.reload();
|
||
})
|
||
.fail(function (xhr) {
|
||
var data = xhr.responseJSON;
|
||
|
||
if (data && data.archived) {
|
||
if (window.confirm('Статья «' + data.archived.title + '» уже есть в архиве. Восстановить её вместо создания новой?')) {
|
||
var csrf = $form.find('[name=csrf_token]').val();
|
||
|
||
$.post('/categories/restore/' + data.archived.id, {csrf_token: csrf})
|
||
.done(function () {
|
||
window.location.reload();
|
||
})
|
||
.fail(function () {
|
||
window.alert('Не удалось восстановить статью');
|
||
});
|
||
}
|
||
return;
|
||
}
|
||
|
||
var errors = data && data.errors;
|
||
var message = errors ? Object.values(errors).join(' ') : 'Не удалось сохранить статью';
|
||
|
||
$error.text(message).show();
|
||
});
|
||
});
|
||
|
||
$(document).on('change', '.js-category-move', function () {
|
||
var $select = $(this);
|
||
var newParent = $select.val();
|
||
|
||
if (newParent === '') {
|
||
return;
|
||
}
|
||
|
||
var $row = $select.closest('.category-row');
|
||
var csrf = $form.find('[name=csrf_token]').val();
|
||
|
||
$.post('/categories/edit/' + $row.data('id'), {
|
||
csrf_token: csrf,
|
||
title: $row.data('title'),
|
||
type: $row.data('type'),
|
||
parent_id: newParent,
|
||
linked_expense_categorie_id: $row.data('linked') || '',
|
||
formula_pct: $row.data('pct') || ''
|
||
})
|
||
.done(function () {
|
||
window.location.reload();
|
||
})
|
||
.fail(function (xhr) {
|
||
var errors = xhr.responseJSON && xhr.responseJSON.errors;
|
||
var message = errors ? Object.values(errors).join(' ') : 'Не удалось перенести статью';
|
||
|
||
window.alert(message);
|
||
$select.val('');
|
||
});
|
||
});
|
||
|
||
$(document).on('click', '.room-menu-btn', function () {
|
||
$(this).closest('.room-menu').toggleClass('open');
|
||
});
|
||
|
||
$(document).on('click', function (e) {
|
||
if (!$(e.target).closest('.room-menu').length) {
|
||
$('.room-menu.open').removeClass('open');
|
||
}
|
||
});
|
||
});
|