Numex yayın: public/js/products.js
This commit is contained in:
parent
11a9149766
commit
b3eb627c4d
118
public/js/products.js
Normal file
118
public/js/products.js
Normal 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); });
|
||||
});
|
||||
}
|
||||
})();
|
||||
Loading…
Reference in New Issue
Block a user