Numex yayın: public/js/products.js

This commit is contained in:
numex-admin 2026-09-10 08:58:53 +00:00
parent 11a9149766
commit b3eb627c4d

118
public/js/products.js Normal file
View File

@ -0,0 +1,118 @@
/* 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); });
});
}
})();