$(function () { var modalEl = document.getElementById('tx-modal'); if (!modalEl) { return; } var modal = new bootstrap.Modal(modalEl); var $form = $('#tx-form'); var $error = $('#tx-form-error'); function filterCategoryOptions(type) { $('#tx-category option[data-type]').each(function () { var match = $(this).data('type') === type; $(this).prop('hidden', !match).prop('disabled', !match); }); var $selected = $('#tx-category option:selected'); if ($selected.data('type') && $selected.data('type') !== type) { $('#tx-category').val(''); } } function setType(type) { $('#tx-type-tiles .pm-tile').removeClass('selected'); $('#tx-type-tiles .pm-tile[data-type="' + type + '"]').addClass('selected'); $('#tx-type-hidden').val(type); var isTransfer = type === 'transfer'; $('#tx-category-field').toggle(!isTransfer); $('#tx-category').prop('required', !isTransfer); if (!isTransfer) { filterCategoryOptions(type); } var needsF = type === 'expense' || isTransfer; $('#tx-account-f-field').toggle(needsF); $('#tx-account-f').prop('required', needsF); var needsIn = type === 'income' || isTransfer; $('#tx-account-in-field').toggle(needsIn); $('#tx-account-in').prop('required', needsIn); } function resetForm() { $form[0].reset(); $form.find('[name=id]').val(''); $error.hide().text(''); $form.find('[name=date]').val(new Date().toISOString().slice(0, 10)); setType('expense'); } function populateEditForm($row) { resetForm(); $form.data('mode', 'edit').attr('action', '/transactions/edit/' + $row.data('id')); $form.find('[name=id]').val($row.data('id')); $form.find('[name=date]').val($row.data('date')); $form.find('[name=summa]').val($row.data('summa')); setType($row.data('type')); $form.find('[name=categorie_id]').val($row.data('categorie-id') || ''); $form.find('[name=account_f_id]').val($row.data('account-f-id') || ''); $form.find('[name=account_in_id]').val($row.data('account-in-id') || ''); $('#tx-modal-title').text('Редактировать операцию'); modal.show(); } $(document).on('click', '.js-tx-add', function () { resetForm(); $form.data('mode', 'create').attr('action', '/transactions/create'); $('#tx-modal-title').text('Новая операция'); modal.show(); }); $(document).on('click', '#tx-type-tiles .pm-tile', function () { setType($(this).data('type')); }); $(document).on('click', '.js-tx-edit', function (e) { e.preventDefault(); populateEditForm($(this).closest('.stat-row')); }); $(document).on('click', '.js-tx-delete', function (e) { e.preventDefault(); var $row = $(this).closest('.stat-row'); var csrf = $form.find('[name=csrf_token]').val(); if (!window.confirm('Удалить операцию?')) { return; } $.post('/transactions/delete/' + $row.data('id'), {csrf_token: csrf}) .done(function () { window.location.reload(); }) .fail(function () { window.alert('Не удалось удалить операцию'); }); }); $(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'); } }); $(document).on('submit', '#tx-form', function (e) { e.preventDefault(); $error.hide().text(''); $.post($form.attr('action'), $form.serialize()) .done(function () { window.location.reload(); }) .fail(function (xhr) { var errors = xhr.responseJSON && xhr.responseJSON.errors; var message = errors ? Object.values(errors).join(' ') : 'Не удалось сохранить операцию'; $error.text(message).show(); }); }); resetForm(); });