envanter-dokuman/public/js/products.js

119 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* products.js — ürün formu AJAX, silme, stok işlem modalı */
(function () {
'use strict';
function showError(el, msg) {
el.textContent = msg;
el.style.display = 'block';
}
function hideError(el) { el.style.display = 'none'; }
/* ---- Ürün silme (list sayfası) ---- */
document.querySelectorAll('.delete-product').forEach(function (btn) {
btn.addEventListener('click', function () {
const id = btn.dataset.id;
if (!confirm('Bu ürünü silmek istediğinize emin misiniz?')) return;
fetch('/api/products/' + id, { method: 'DELETE' })
.then(function (res) {
if (res.status === 204) { window.location.reload(); return; }
return res.json().then(function (d) { throw new Error(d.error || 'Silinemedi'); });
})
.catch(function (err) { alert('Hata: ' + err.message); });
});
});
/* ---- Ürün formu submit (form/edit sayfası) ---- */
const prodForm = document.getElementById('productForm');
if (prodForm) {
prodForm.addEventListener('submit', function (e) {
e.preventDefault();
const errBox = document.getElementById('formError');
hideError(errBox);
const formData = new FormData(prodForm);
const method = formData.get('_method') === 'PUT' ? 'PUT' : 'POST';
const url = formData.get('_api') ? '/api/products' : prodForm.getAttribute('action');
const body = {};
formData.forEach(function (v, k) { if (k !== '_method' && k !== '_api') body[k] = v; });
const actionUrl = prodForm.getAttribute('action');
const finalUrl = method === 'PUT' ? actionUrl : '/api/products';
fetch(finalUrl, {
method: method,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
})
.then(function (res) {
if (res.redirected) { window.location.href = res.url; return null; }
return res.json().then(function (d) {
if (!res.ok) throw new Error(d.error || 'Bir hata oluştu');
return d;
});
})
.then(function () {
window.location.href = '/api/products';
})
.catch(function (err) { showError(errBox, err.message); });
});
}
/* ---- Stok giriş/çıkış modalı (detay sayfası) ---- */
const stockModal = document.getElementById('stockModal');
const modalTitle = document.getElementById('modalTitle');
const stockForm = document.getElementById('stockForm');
function openModal(mode) {
const isIn = mode === 'in';
modalTitle.textContent = isIn ? 'Stok Girişi (+)' : 'Stok Çıkışı ()';
stockForm.querySelector('input[name="mode"]').value = mode;
document.getElementById('stockSubmit').textContent = isIn ? 'Girişi Onayla' : ıkışı Onayla';
stockForm.reset();
stockForm.querySelector('input[name="productId"]').value =
stockForm.querySelector('input[name="productId"]').value;
hideError(document.getElementById('stockError'));
stockModal.style.display = 'flex';
document.getElementById('stockQty').focus();
}
function closeModal() { stockModal.style.display = 'none'; }
if (stockModal) {
document.querySelectorAll('.stock-action').forEach(function (btn) {
btn.addEventListener('click', function () { openModal(btn.dataset.mode); });
});
document.getElementById('modalClose').addEventListener('click', closeModal);
stockModal.addEventListener('click', function (e) {
if (e.target === stockModal) closeModal();
});
stockForm.addEventListener('submit', function (e) {
e.preventDefault();
const errBox = document.getElementById('stockError');
hideError(errBox);
const mode = stockForm.querySelector('input[name="mode"]').value;
const productId = stockForm.querySelector('input[name="productId"]').value;
const quantity = document.getElementById('stockQty').value;
const note = document.getElementById('stockNote').value;
fetch('/api/stock/' + mode, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ productId: productId, quantity: quantity, note: note })
})
.then(function (res) {
return res.json().then(function (d) {
if (!res.ok) throw new Error(d.error || 'İşlem başarısız');
return d;
});
})
.then(function (data) {
if (data.lowStock) alert('⚠️ Dikkat: Bu ürün artık düşük stok seviyesinde!');
window.location.reload();
})
.catch(function (err) { showError(errBox, err.message); });
});
}
})();