178 lines
11 KiB
PHP
178 lines
11 KiB
PHP
<?php
|
||
$pageTitle = 'مدیریت محصولات، قیمتها و سطوح عمدهفروشی';
|
||
require __DIR__ . '/layout_header.php';
|
||
?>
|
||
|
||
<div class="flex justify-between items-center mb-6">
|
||
<h3 class="font-extrabold text-stone-900 text-base">لیست محصولات فعال فروشگاه</h3>
|
||
<button onclick="document.getElementById('new-product-modal').classList.remove('hidden')" class="px-4 py-2 rounded-xl bg-amber-500 hover:bg-amber-600 text-stone-950 text-xs font-bold transition flex items-center gap-1.5 shadow-sm">
|
||
<i class="fas fa-plus"></i> افزودن محصول جدید
|
||
</button>
|
||
</div>
|
||
|
||
<div class="bg-white rounded-2xl border border-stone-200 shadow-sm overflow-hidden">
|
||
<div class="overflow-x-auto">
|
||
<table class="w-full text-right text-xs">
|
||
<thead class="bg-stone-50 text-stone-600 border-b">
|
||
<tr>
|
||
<th class="p-3.5">تصویر و عنوان</th>
|
||
<th class="p-3.5">دسته</th>
|
||
<th class="p-3.5">قیمت تکی</th>
|
||
<th class="p-3.5">قیمت عمده (پله ۱)</th>
|
||
<th class="p-3.5">موجودی</th>
|
||
<th class="p-3.5 text-center">عملیات</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody class="divide-y divide-stone-100">
|
||
<?php foreach ($products as $p): ?>
|
||
<tr class="hover:bg-stone-50">
|
||
<td class="p-3.5 flex items-center gap-3 font-bold text-stone-900">
|
||
<img src="<?= $p['image'] ?>" class="w-10 h-10 object-contain bg-stone-100 rounded-lg p-1">
|
||
<div>
|
||
<span><?= htmlspecialchars($p['name']) ?></span>
|
||
<span class="block text-[10px] text-stone-400 font-normal"><?= htmlspecialchars($p['slug']) ?></span>
|
||
</div>
|
||
</td>
|
||
<td class="p-3.5 text-stone-600"><?= htmlspecialchars($p['category_name']) ?></td>
|
||
<td class="p-3.5 font-bold text-stone-900"><?= \Bildirchin\Helpers::formatPrice($p['price']) ?> / <?= $p['unit'] ?></td>
|
||
<td class="p-3.5 text-amber-800 font-bold">
|
||
<?= $p['wholesale_price'] > 0 ? \Bildirchin\Helpers::formatPrice($p['wholesale_price']) : '-' ?>
|
||
</td>
|
||
<td class="p-3.5 font-bold text-stone-700"><?= \Bildirchin\Helpers::toPersianDigits($p['stock']) ?> <?= $p['unit'] ?></td>
|
||
<td class="p-3.5 text-center">
|
||
<div class="flex items-center justify-center gap-2">
|
||
<button onclick='editProduct(<?= json_encode($p) ?>)' class="px-2.5 py-1 rounded bg-stone-100 text-stone-700 hover:bg-stone-200 text-xs">ویرایش</button>
|
||
<form action="/admin/product/delete" method="POST" onsubmit="return confirm('آیا از حذف این محصول مطمئن هستید؟')">
|
||
<input type="hidden" name="id" value="<?= $p['id'] ?>">
|
||
<button type="submit" class="px-2.5 py-1 rounded bg-rose-50 text-rose-600 hover:bg-rose-100 text-xs">حذف</button>
|
||
</form>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Modal Create / Edit Product -->
|
||
<div id="new-product-modal" class="fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4 hidden">
|
||
<div class="bg-white rounded-3xl max-w-2xl w-full max-h-[90vh] overflow-y-auto p-6 sm:p-8 space-y-4">
|
||
<div class="flex justify-between items-center border-b pb-3">
|
||
<h4 class="font-bold text-base text-stone-900" id="modal-title">افزودن / ویرایش محصول</h4>
|
||
<button onclick="document.getElementById('new-product-modal').classList.add('hidden')" class="text-stone-400 hover:text-stone-700"><i class="fas fa-times text-lg"></i></button>
|
||
</div>
|
||
|
||
<form action="/admin/product/save" method="POST" class="space-y-4 text-xs">
|
||
<input type="hidden" name="id" id="prod-id" value="0">
|
||
|
||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">نام محصول *</label>
|
||
<input type="text" name="name" id="prod-name" required class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs focus:ring-2 focus:ring-amber-500">
|
||
</div>
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">دستهبندی *</label>
|
||
<select name="category_id" id="prod-cat" class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs">
|
||
<?php foreach ($categories as $c): ?>
|
||
<option value="<?= $c['id'] ?>"><?= htmlspecialchars($c['name']) ?></option>
|
||
<?php endforeach; ?>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid grid-cols-1 sm:grid-cols-3 gap-4">
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">قیمت مصرفکننده (تومان) *</label>
|
||
<input type="number" name="price" id="prod-price" required class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs">
|
||
</div>
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">واحد اندازهگیری</label>
|
||
<input type="text" name="unit" id="prod-unit" value="عدد" class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs">
|
||
</div>
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">موجودی انبار</label>
|
||
<input type="number" name="stock" id="prod-stock" value="100" class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="bg-amber-50/60 p-4 rounded-2xl border border-amber-200 space-y-3">
|
||
<span class="font-bold text-amber-900 block">تنظیمات سطوح عمدهفروشی</span>
|
||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||
<div>
|
||
<label class="block text-stone-600 mb-1">حداقل تعداد پله ۱ عمده:</label>
|
||
<input type="number" name="wholesale_min_qty" id="prod-wmin" value="50" class="w-full bg-white border border-stone-300 rounded-xl p-2 text-xs">
|
||
</div>
|
||
<div>
|
||
<label class="block text-stone-600 mb-1">قیمت عمده پله ۱ (تومان):</label>
|
||
<input type="number" name="wholesale_price" id="prod-wprice" value="0" class="w-full bg-white border border-stone-300 rounded-xl p-2 text-xs">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||
<div>
|
||
<label class="block text-stone-600 mb-1">حداقل تعداد پله ۲ (تیراژ بالا):</label>
|
||
<input type="number" name="wholesale_tier2_qty" id="prod-t2qty" value="200" class="w-full bg-white border border-stone-300 rounded-xl p-2 text-xs">
|
||
</div>
|
||
<div>
|
||
<label class="block text-stone-600 mb-1">قیمت عمده پله ۲ (تومان):</label>
|
||
<input type="number" name="wholesale_tier2_price" id="prod-t2price" value="0" class="w-full bg-white border border-stone-300 rounded-xl p-2 text-xs">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">توضیح کوتاه</label>
|
||
<input type="text" name="short_desc" id="prod-short" class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs">
|
||
</div>
|
||
|
||
<div>
|
||
<label class="block font-bold text-stone-700 mb-1">توضیحات کامل محصول</label>
|
||
<textarea name="full_desc" id="prod-full" rows="3" class="w-full bg-stone-50 border border-stone-300 rounded-xl p-2.5 text-xs"></textarea>
|
||
</div>
|
||
|
||
<div class="flex items-center gap-6 pt-2">
|
||
<label class="flex items-center gap-2 cursor-pointer">
|
||
<input type="checkbox" name="is_wholesale_available" id="prod-is-w" checked class="text-amber-600">
|
||
<span class="font-bold">فروش عمده فعال باشد</span>
|
||
</label>
|
||
<label class="flex items-center gap-2 cursor-pointer">
|
||
<input type="checkbox" name="is_featured" id="prod-featured" checked class="text-amber-600">
|
||
<span class="font-bold">نمایش در صفحه اول</span>
|
||
</label>
|
||
</div>
|
||
|
||
<div class="pt-4 border-t flex justify-end gap-3">
|
||
<button type="button" onclick="document.getElementById('new-product-modal').classList.add('hidden')" class="px-4 py-2 rounded-xl bg-stone-200 text-stone-800 font-bold">انصراف</button>
|
||
<button type="submit" class="px-6 py-2 rounded-xl bg-amber-500 hover:bg-amber-600 text-stone-950 font-bold">ذخیره اطلاعات</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
function editProduct(p) {
|
||
document.getElementById('prod-id').value = p.id;
|
||
document.getElementById('prod-name').value = p.name;
|
||
document.getElementById('prod-cat').value = p.category_id;
|
||
document.getElementById('prod-price').value = p.price;
|
||
document.getElementById('prod-unit').value = p.unit;
|
||
document.getElementById('prod-stock').value = p.stock;
|
||
document.getElementById('prod-wmin').value = p.wholesale_min_qty;
|
||
document.getElementById('prod-wprice').value = p.wholesale_price;
|
||
document.getElementById('prod-t2qty').value = p.wholesale_tier2_qty;
|
||
document.getElementById('prod-t2price').value = p.wholesale_tier2_price;
|
||
document.getElementById('prod-short').value = p.short_desc;
|
||
document.getElementById('prod-full').value = p.full_desc;
|
||
document.getElementById('prod-is-w').checked = parseInt(p.is_wholesale_available) === 1;
|
||
document.getElementById('prod-featured').checked = parseInt(p.is_featured) === 1;
|
||
|
||
document.getElementById('modal-title').innerText = 'ویرایش محصول: ' + p.name;
|
||
document.getElementById('new-product-modal').classList.remove('hidden');
|
||
}
|
||
</script>
|
||
|
||
<?php
|
||
require __DIR__ . '/layout_footer.php';
|
||
?>
|