updating items

This commit is contained in:
Flatlogic Bot 2026-03-03 17:59:49 +00:00
parent c34a6ddf37
commit a7d442be5d
2 changed files with 273 additions and 331 deletions

5
cookies.txt Normal file
View File

@ -0,0 +1,5 @@
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
localhost FALSE / FALSE 0 PHPSESSID 7ksl899v5vo08i9all8u0pma2i

599
items.php
View File

@ -274,19 +274,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
$service_id = $_POST['service_id'];
$price = $_POST['price'];
$stmt = db()->prepare("INSERT INTO prices (item_id, service_id, price)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE price = ?");
$stmt->execute([$item_id, $service_id, $price, $price]);
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['success' => true]);
// Handle empty/invalid price
if ($price === '') $price = 0;
$price = str_replace(',', '.', $price); // Handle comma as decimal separator
$price = (float)$price;
try {
$stmt = db()->prepare("INSERT INTO prices (item_id, service_id, price)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE price = ?");
$stmt->execute([$item_id, $service_id, $price, $price]);
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['success' => true]);
exit;
}
header('Location: items.php?success=price_updated');
exit;
} catch (Exception $e) {
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
exit;
}
header('Location: items.php?error=save_failed');
exit;
}
header('Location: items.php?success=price_updated');
exit;
}
}
@ -338,257 +353,208 @@ foreach ($prices_raw as $p) {
?>
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="fw-bold m-0"><?= __('items_management') ?? 'Items Management' ?></h4>
<div>
<button class="btn btn-outline-secondary px-4 fw-bold me-2" style="border-radius: 12px;" data-bs-toggle="modal" data-bs-target="#categoryModal">
<i class="bi bi-tag me-2"></i><?= __('categories') ?? 'Categories' ?>
<h2 class="fw-bold mb-1"><?= __('items') ?></h2>
<p class="text-muted small mb-0"><?= __('manage_items_categories_services') ?? 'Manage your items, categories and services' ?></p>
</div>
<div class="d-flex gap-2">
<button type="button" class="btn btn-light shadow-sm px-3" style="border-radius: 12px;" data-bs-toggle="modal" data-bs-target="#categoriesModal">
<i class="bi bi-tags me-2 text-primary"></i> <?= __('categories') ?>
</button>
<button class="btn btn-outline-primary px-4 fw-bold me-2" style="border-radius: 12px;" data-bs-toggle="modal" data-bs-target="#serviceModal">
<i class="bi bi-gear me-2"></i><?= __('services') ?? 'Services' ?>
<button type="button" class="btn btn-light shadow-sm px-3" style="border-radius: 12px;" data-bs-toggle="modal" data-bs-target="#servicesModal">
<i class="bi bi-gear me-2 text-primary"></i> <?= __('services') ?>
</button>
<?php if (has_permission('add')):
?><button class="btn btn-primary px-4 fw-bold" style="border-radius: 12px;" onclick="openItemModal()">
<i class="bi bi-plus-lg me-2"></i><?= __('add_item') ?>
<?php if (has_permission('add')): ?>
<button type="button" class="btn btn-primary shadow-sm px-4" style="border-radius: 12px;" data-bs-toggle="modal" data-bs-target="#itemModal" onclick="resetForm()">
<i class="bi bi-plus-lg me-2"></i> <?= __('add_item') ?>
</button>
<?php endif; ?>
</div>
</div>
<!-- Filter Bar -->
<div class="card border-0 shadow-sm mb-4" style="border-radius: 20px;">
<div class="card-body p-4">
<form method="GET" class="row g-3 align-items-end">
<form method="GET" class="row g-3">
<div class="col-md-5">
<label class="form-label fw-bold small text-muted text-uppercase mb-2"><?= __('search') ?></label>
<div class="input-group">
<span class="input-group-text bg-light border-0" style="border-radius: 12px 0 0 12px;">
<i class="bi bi-search"></i>
</span>
<input type="text" name="search" class="form-control bg-light border-0" value="<?= htmlspecialchars($search) ?>" placeholder="<?= __('search_placeholder') ?? 'Search items...' ?>" style="border-radius: 0 12px 12px 0;">
<span class="input-group-text bg-light border-0"><i class="bi bi-search"></i></span>
<input type="text" name="search" class="form-control bg-light border-0" placeholder="<?= __('search_items') ?>" value="<?= htmlspecialchars($search) ?>">
</div>
</div>
<div class="col-md-4">
<label class="form-label fw-bold small text-muted text-uppercase mb-2"><?= __('category') ?></label>
<select name="category_id" class="form-select bg-light border-0" style="border-radius: 12px;">
<option value=""><?= __('all') ?></option>
<select name="category_id" class="form-select bg-light border-0">
<option value=""><?= __('all_categories') ?></option>
<?php foreach($categories as $cat): ?>
<option value="<?= $cat['id'] ?>" <?= $category_filter == $cat['id'] ? 'selected' : '' ?> >
<?= $lang === 'ar' ? ($cat['name_ar'] ?: $cat['name_en']) : $cat['name_en'] ?>
<?= $lang === 'ar' ? $cat['name_ar'] : $cat['name_en'] ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3 d-flex gap-2">
<button type="submit" class="btn btn-primary flex-grow-1 fw-bold" style="border-radius: 12px; height: 45px;">
<i class="bi bi-filter me-2"></i><?= __('submit') ?>
</button>
<a href="items.php" class="btn btn-light fw-bold" style="border-radius: 12px; height: 45px;">
<i class="bi bi-x-lg"></i>
</a>
<div class="col-md-3">
<button type="submit" class="btn btn-dark w-100" style="border-radius: 12px;"><?= __('filter') ?></button>
</div>
</form>
</div>
</div>
<?php if(isset($_GET['success'])): ?>
<div class="alert alert-success alert-dismissible fade show rounded-4 shadow-sm mb-4 border-0" role="alert">
<i class="bi bi-check-circle-fill me-2"></i>
<?= __($_GET['success']) ?? 'Action completed successfully' ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<?php if(isset($_GET['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show rounded-4 shadow-sm mb-4 border-0" role="alert">
<i class="bi bi-exclamation-triangle-fill me-2"></i>
<?= __($_GET['error']) ?? 'Permission Denied' ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="card p-0 border-0 shadow-sm mb-4" style="border-radius: 20px; overflow: hidden;">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="bg-light">
<tr>
<th class="ps-4 py-3"><?= __('item') ?></th>
<th class="py-3"><?= __('category') ?></th>
<th class="py-3"><?= __('vat_percent') ?></th>
<th class="py-3"><?= __('pricing_services') ?? 'Pricing & Services' ?></th>
<th class="pe-4 py-3 text-end"><?= __('actions') ?></th>
</tr>
</thead>
<tbody>
<?php if (empty($items)): ?>
<tr>
<td colspan="5" class="text-center py-5">
<i class="bi bi-box-seam display-4 text-muted mb-3 d-block"></i>
<p class="text-muted"><?= __('no_items_found') ?></p>
</td>
</tr>
<?php else: ?>
<?php foreach($items as $item):
?><tr>
<td class="ps-4">
<div class="d-flex align-items-center">
<div class="bg-light rounded-3 me-3 d-flex align-items-center justify-content-center" style="width: 48px; height: 48px; overflow: hidden;">
<?php if($item['image_url']):
?><img src="<?= $item['image_url'] ?>?v=<?= time() ?>" alt="" style="width: 100%; height: 100%; object-fit: cover;">
<?php else:
?><i class="bi bi-image text-muted"></i>
<?php endif; ?>
</div>
<div>
<div class="fw-bold"><?= $lang === 'ar' ? ($item['name_ar'] ?: $item['name_en']) : $item['name_en'] ?></div>
<?php if($lang === 'ar' && $item['name_ar']):
?><small class="text-muted"><?= $item['name_en'] ?></small>
<?php elseif($lang === 'en' && $item['name_ar']):
?><small class="text-muted"><?= $item['name_ar'] ?></small>
<?php endif; ?>
</div>
</div>
</td>
<td>
<span class="badge bg-soft-primary text-primary px-3 py-2" style="border-radius: 8px;">
<?= $lang === 'ar' ? ($item['cat_ar'] ?: $item['cat_en']) : $item['cat_en'] ?>
</span>
</td>
<td><?= number_format($item['vat_percent'], 2) ?>%</td>
<td>
<button class="btn btn-sm btn-outline-info px-3" style="border-radius: 8px;" data-bs-toggle="modal" data-bs-target="#pricingModal<?= $item['id'] ?>">
<i class="bi bi-currency-dollar me-1"></i> <?= count($services) ?> <?= __('services') ?>
</button>
</td>
<td class="pe-4 text-end">
<?php if (has_permission('edit')): ?>
<button class="btn btn-sm btn-light p-2 me-1" style="border-radius: 10px;" onclick="openItemModal(<?= htmlspecialchars(json_encode($item), ENT_QUOTES) ?>)">
<i class="bi bi-pencil text-primary"></i>
</button>
<?php endif; ?>
<?php if (has_permission('delete')): ?>
<button class="btn btn-sm btn-light p-2" style="border-radius: 10px;" onclick="confirmDelete('item', <?= $item['id'] ?>)">
<i class="bi bi-trash text-danger"></i>
</button>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
<div class="alert alert-info border-0 shadow-sm rounded-4 mb-4">
<div class="d-flex">
<i class="bi bi-info-circle-fill me-3 fs-4"></i>
<div>
<h6 class="fw-bold mb-1">How to manage Services?</h6>
<p class="mb-0 small">
<strong>Services:</strong> Actions like "Wash Only", "Urgent Wash", "Iron Only". Add them using the <strong>Services</strong> button at the top, then set prices for each item in the table above.<br>
<em>Simplified:</em> We removed "Variants" to make it easier. Now you just define your services and set their prices for each item.
</p>
<div class="row g-4">
<?php foreach($items as $item):
?><div class="col-md-6 col-lg-4 col-xl-3">
<div class="card h-100 border-0 shadow-sm item-card" style="border-radius: 20px; overflow: hidden;">
<div style="height: 180px; overflow: hidden; position: relative;">
<?php if ($item['image_url']): ?>
<img src="<?= htmlspecialchars($item['image_url']) ?>" class="card-img-top h-100 w-100 object-fit-cover" alt="<?= htmlspecialchars($item['name_en']) ?>">
<?php else:
?><div class="bg-light h-100 w-100 d-flex align-items-center justify-content-center">
<i class="bi bi-image text-muted opacity-25" style="font-size: 3rem;"></i>
</div>
<?php endif; ?>
<div class="position-absolute top-0 end-0 p-3">
<span class="badge bg-white text-dark shadow-sm py-2 px-3" style="border-radius: 10px;">
<?= htmlspecialchars($item['cat_en'] ?? __('uncategorized')) ?>
</span>
</div>
</div>
<div class="card-body p-4">
<h5 class="fw-bold mb-1"><?= htmlspecialchars($item['name_en']) ?></h5>
<p class="text-muted small mb-3"><?= htmlspecialchars($item['name_ar']) ?></p>
<div class="d-flex align-items-center justify-content-between mt-auto">
<div class="text-primary small fw-bold">
<?= count($services) ?> <?= __('services') ?>
</div>
<div class="btn-group">
<button class="btn btn-sm btn-light p-2" style="border-radius: 8px;" data-bs-toggle="modal" data-bs-target="#pricingModal<?= $item['id'] ?>">
<i class="bi bi-tag-fill text-primary"></i>
</button>
<?php if (has_permission('edit')): ?>
<button class="btn btn-sm btn-light p-2 mx-1" style="border-radius: 8px;" onclick="editItem(<?= htmlspecialchars(json_encode($item), ENT_QUOTES) ?>)">
<i class="bi bi-pencil text-primary"></i>
</button>
<?php endif; ?>
<?php if (has_permission('delete')): ?>
<button class="btn btn-sm btn-light p-2" style="border-radius: 8px;" onclick="confirmDeleteAjax('item', <?= $item['id'] ?>)">
<i class="bi bi-trash text-danger"></i>
</button>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<!-- Item Modal (Add/Edit) -->
<!-- Modals -->
<!-- Item Modal -->
<div class="modal fade" id="itemModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content" style="border-radius: 25px;">
<form id="itemForm" method="POST" enctype="multipart/form-data">
<div class="modal-header border-0 p-4 pb-0">
<h5 class="modal-title fw-bold" id="itemModalLabel"><?= __('add_item') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4">
<div class="modal-header border-0 p-4">
<h5 class="modal-title fw-bold" id="itemModalLabel"><?= __('add_item') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4 pt-0">
<form id="itemForm" method="POST" enctype="multipart/form-data">
<input type="hidden" name="action" id="itemAction" value="add_item">
<input type="hidden" name="id" id="itemId">
<div class="text-center mb-4">
<div id="imagePreviewContainer" class="d-none mb-3">
<img id="imagePreview" src="" class="rounded-4 shadow-sm" style="max-height: 150px; width: auto;">
</div>
<label class="btn btn-light w-100 py-3 mb-0" style="border-radius: 15px; border: 2px dashed #dee2e6;">
<i class="bi bi-cloud-arrow-up fs-4 d-block mb-1"></i>
<span class="small text-muted"><?= __('upload_image') ?></span>
<input type="file" name="image" id="itemImageFile" class="d-none" accept="image/*">
</label>
</div>
<div class="mb-3">
<label class="form-label fw-bold small"><?= __('category') ?></label>
<select name="category_id" id="itemCategory" class="form-select" style="border-radius: 12px;" required>
<label class="form-label small fw-bold"><?= __('name_en') ?></label>
<div class="input-group">
<input type="text" name="name_en" id="itemNameEn" class="form-control" placeholder="Item Name (English)" required>
<button type="button" class="btn btn-outline-secondary" onclick="translateField('itemNameEn', 'itemNameAr', 'en-ar')">
<i class="bi bi-translate"></i>
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('name_ar') ?></label>
<div class="input-group">
<input type="text" name="name_ar" id="itemNameAr" class="form-control text-end" placeholder="اسم الصنف (بالعربي)" required>
<button type="button" class="btn btn-outline-secondary" onclick="translateField('itemNameAr', 'itemNameEn', 'ar-en')">
<i class="bi bi-translate"></i>
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('category') ?></label>
<select name="category_id" id="itemCategory" class="form-select" required>
<option value=""><?= __('select_category') ?></option>
<?php foreach($categories as $cat):
?><option value="<?= $cat['id'] ?>"><?= $lang === 'ar' ? ($cat['name_ar'] ?: $cat['name_en']) : $cat['name_en'] ?></option>
?><option value="<?= $cat['id'] ?>"><?= $lang === 'ar' ? $cat['name_ar'] : $cat['name_en'] ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label fw-bold small"><?= __('name_en') ?></label>
<div class="input-group"><input type="text" name="name_en" id="itemNameEn" class="form-control" required style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('itemNameEn', 'itemNameAr', 'en-ar')"><i class="bi bi-translate"></i></button></div>
</div>
<div class="col-md-6 mb-3">
<label class="form-label fw-bold small"><?= __('name_ar') ?></label>
<div class="input-group"><input type="text" name="name_ar" id="itemNameAr" class="form-control" style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('itemNameAr', 'itemNameEn', 'ar-en')"><i class="bi bi-translate"></i></button></div>
</div>
<div class="mb-4">
<label class="form-label small fw-bold"><?= __('vat_percent') ?> (%)</label>
<input type="number" step="0.01" name="vat_percent" id="itemVat" class="form-control" placeholder="0.00">
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label fw-bold small"><?= __('vat_percent') ?></label>
<div class="input-group">
<input type="number" step="0.01" name="vat_percent" id="itemVat" class="form-control" value="0.00" style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;">
<span class="input-group-text" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;">%</span>
</div>
</div>
<div class="col-md-6 mb-3">
<label class="form-label fw-bold small"><?= __('image') ?? 'Image' ?></label>
<input type="file" name="image" id="itemImageFile" class="form-control" style="border-radius: 12px;" accept="image/*">
<div id="imagePreviewContainer" class="mt-2 d-none">
<img id="imagePreview" src="" alt="Preview" class="img-thumbnail" style="max-height: 100px;">
</div>
</div>
<div class="d-flex gap-2">
<button type="button" class="btn btn-light w-100 py-2 fw-bold" style="border-radius: 12px;" data-bs-dismiss="modal"><?= __('cancel') ?></button>
<button type="submit" class="btn btn-primary w-100 py-2 fw-bold" style="border-radius: 12px;"><?= __('save') ?></button>
</div>
</div>
<div class="modal-footer border-0 p-4 pt-0">
<button type="submit" class="btn btn-primary w-100 py-3 fw-bold shadow-sm" style="border-radius: 15px;">
<?= __('save_changes') ?? 'Save Changes' ?>
</button>
</div>
</form>
</form>
</div>
</div>
</div>
</div>
<!-- Categories Modal -->
<div class="modal fade" id="categoryModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal fade" id="categoriesModal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content" style="border-radius: 25px;">
<div class="modal-header border-0 p-4">
<h5 class="modal-title fw-bold"><?= __('categories_management') ?? 'Categories Management' ?></h5>
<h5 class="modal-title fw-bold"><?= __('manage_categories') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4 pt-0">
<div class="row">
<div class="row g-4">
<div class="col-md-5">
<div class="bg-light p-4" style="border-radius: 20px;">
<?php if (has_permission('add')):
?><h6 class="fw-bold mb-3" id="catFormLabel"><?= __('add_new_category') ?></h6>
<form id="categoryForm" method="POST">
<input type="hidden" name="action" id="catAction" value="add_category">
<input type="hidden" name="id" id="catId">
<input type="hidden" name="ajax" value="1">
<div class="mb-3">
<label class="form-label small"><?= __('name_en') ?></label>
<div class="input-group"><input type="text" name="cat_name_en" id="catNameEn" class="form-control" required style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('catNameEn', 'catNameAr', 'en-ar')"><i class="bi bi-translate"></i></button></div>
<form id="categoryForm" method="POST">
<input type="hidden" name="action" id="catAction" value="add_category">
<input type="hidden" name="id" id="catId">
<input type="hidden" name="ajax" value="1">
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('name_en') ?></label>
<div class="input-group">
<input type="text" name="cat_name_en" id="catNameEn" class="form-control" required>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="translateField('catNameEn', 'catNameAr', 'en-ar')">
<i class="bi bi-translate"></i>
</button>
</div>
<div class="mb-3">
<label class="form-label small"><?= __('name_ar') ?></label>
<div class="input-group"><input type="text" name="cat_name_ar" id="catNameAr" class="form-control" style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('catNameAr', 'catNameEn', 'ar-en')"><i class="bi bi-translate"></i></button></div>
</div>
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('name_ar') ?></label>
<div class="input-group">
<input type="text" name="cat_name_ar" id="catNameAr" class="form-control text-end" required>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="translateField('catNameAr', 'catNameEn', 'ar-en')">
<i class="bi bi-translate"></i>
</button>
</div>
<button type="submit" class="btn btn-secondary w-100 py-2 fw-bold" style="border-radius: 12px;">
<?= __('save') ?>
</button>
<button type="button" id="cancelCatEdit" class="btn btn-link w-100 btn-sm mt-2 text-decoration-none d-none" onclick="resetCatForm()">
<?= __('cancel') ?>
</button>
</form>
<?php else:
?><p class="text-muted small">You don't have permission to add categories.</p>
<?php endif; ?>
</div>
</div>
<button type="submit" class="btn btn-primary w-100 fw-bold" style="border-radius: 10px;">
<span id="catSubmitBtn"><?= __('add_category') ?></span>
</button>
<button type="button" id="catCancelBtn" class="btn btn-light w-100 mt-2 d-none" onclick="resetCatForm()" style="border-radius: 10px;">
<?= __('cancel') ?>
</button>
</form>
</div>
<div class="col-md-7">
<div class="table-responsive" style="max-height: 400px; overflow-y: auto;">
@ -612,42 +578,46 @@ foreach ($prices_raw as $p) {
</div>
<!-- Services Modal -->
<div class="modal fade" id="serviceModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal fade" id="servicesModal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content" style="border-radius: 25px;">
<div class="modal-header border-0 p-4">
<h5 class="modal-title fw-bold"><?= __('services_management') ?? 'Services Management' ?></h5>
<h5 class="modal-title fw-bold"><?= __('manage_services') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4 pt-0">
<div class="row">
<div class="row g-4">
<div class="col-md-5">
<div class="bg-light p-4" style="border-radius: 20px;">
<?php if (has_permission('add')):
?><h6 class="fw-bold mb-3" id="svcFormLabel"><?= __('add_new_service') ?></h6>
<form id="serviceForm" method="POST">
<input type="hidden" name="action" id="svcAction" value="add_service">
<input type="hidden" name="id" id="svcId">
<input type="hidden" name="ajax" value="1">
<div class="mb-3">
<label class="form-label small"><?= __('name_en') ?></label>
<div class="input-group"><input type="text" name="svc_name_en" id="svcNameEn" class="form-control" required style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('svcNameEn', 'svcNameAr', 'en-ar')"><i class="bi bi-translate"></i></button></div>
<form id="serviceForm" method="POST">
<input type="hidden" name="action" id="svcAction" value="add_service">
<input type="hidden" name="id" id="svcId">
<input type="hidden" name="ajax" value="1">
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('name_en') ?></label>
<div class="input-group">
<input type="text" name="svc_name_en" id="svcNameEn" class="form-control" required>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="translateField('svcNameEn', 'svcNameAr', 'en-ar')">
<i class="bi bi-translate"></i>
</button>
</div>
<div class="mb-3">
<label class="form-label small"><?= __('name_ar') ?></label>
<div class="input-group"><input type="text" name="svc_name_ar" id="svcNameAr" class="form-control" style="border-top-left-radius: 12px; border-bottom-left-radius: 12px;"><button type="button" class="btn btn-outline-secondary" style="border-top-right-radius: 12px; border-bottom-right-radius: 12px;" onclick="translateField('svcNameAr', 'svcNameEn', 'ar-en')"><i class="bi bi-translate"></i></button></div>
</div>
<div class="mb-3">
<label class="form-label small fw-bold"><?= __('name_ar') ?></label>
<div class="input-group">
<input type="text" name="svc_name_ar" id="svcNameAr" class="form-control text-end" required>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="translateField('svcNameAr', 'svcNameEn', 'ar-en')">
<i class="bi bi-translate"></i>
</button>
</div>
<button type="submit" class="btn btn-primary w-100 py-2 fw-bold" style="border-radius: 12px;">
<?= __('save') ?>
</button>
<button type="button" id="cancelSvcEdit" class="btn btn-link w-100 btn-sm mt-2 text-decoration-none d-none" onclick="resetSvcForm()">
<?= __('cancel') ?>
</button>
</form>
<?php else:
?><p class="text-muted small">You don't have permission to add services.</p>
<?php endif; ?>
</div>
</div>
<button type="submit" class="btn btn-primary w-100 fw-bold" style="border-radius: 10px;">
<span id="svcSubmitBtn"><?= __('add_service') ?></span>
</button>
<button type="button" id="svcCancelBtn" class="btn btn-light w-100 mt-2 d-none" onclick="resetSvcForm()" style="border-radius: 10px;">
<?= __('cancel') ?>
</button>
</form>
</div>
<div class="col-md-7">
<div class="table-responsive" style="max-height: 400px; overflow-y: auto;">
@ -749,120 +719,69 @@ async function translateField(sourceId, targetId, direction) {
const btn = event.currentTarget;
const originalHtml = btn.innerHTML;
btn.disabled = true;
btn.innerHTML = "<span class=\"spinner-border spinner-border-sm\"></span>";
btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span>';
try {
const formData = new FormData();
formData.append("text", text);
formData.append("direction", direction);
const resp = await fetch("api/translate.php", { method: "POST", body: formData });
const data = await resp.json();
if (data.success) targetEl.value = data.translation;
const response = await fetch('api/translate.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text, direction })
});
const data = await response.json();
if (data.success) { targetEl.value = data.translated; }
} catch (e) { console.error(e); }
finally { btn.disabled = false; btn.innerHTML = originalHtml; }
finally { btn.disabled = false; btn.innerHTML = originalHtml; }
}
function openItemModal(item = null) {
const modal = new bootstrap.Modal(document.getElementById('itemModal'));
const form = document.getElementById('itemForm');
const label = document.getElementById('itemModalLabel');
const actionInput = document.getElementById('itemAction');
const idInput = document.getElementById('itemId');
const imagePreviewContainer = document.getElementById('imagePreviewContainer');
const imagePreview = document.getElementById('imagePreview');
const imageInput = document.getElementById('itemImageFile');
// Reset file input and preview
imageInput.value = '';
imagePreview.src = '';
imagePreviewContainer.classList.add('d-none');
if (item) {
label.innerText = "<?= __('edit_item') ?>";
actionInput.value = 'edit_item';
idInput.value = item.id;
document.getElementById('itemNameEn').value = item.name_en;
document.getElementById('itemNameAr').value = item.name_ar;
document.getElementById('itemCategory').value = item.category_id;
document.getElementById('itemVat').value = item.vat_percent;
if (item.image_url) {
imagePreview.src = item.image_url + '?v=' + new Date().getTime();
imagePreviewContainer.classList.remove('d-none');
}
} else {
label.innerText = "<?= __('add_item') ?>";
actionInput.value = 'add_item';
form.reset();
idInput.value = '';
function resetForm() {
document.getElementById('itemForm').reset();
document.getElementById('itemAction').value = 'add_item';
document.getElementById('itemModalLabel').innerText = '<?= __('add_item') ?>';
document.getElementById('imagePreviewContainer').classList.add('d-none');
}
function editItem(item) {
resetForm();
document.getElementById('itemAction').value = 'edit_item';
document.getElementById('itemId').value = item.id;
document.getElementById('itemNameEn').value = item.name_en;
document.getElementById('itemNameAr').value = item.name_ar;
document.getElementById('itemCategory').value = item.category_id || '';
document.getElementById('itemVat').value = item.vat_percent || '';
document.getElementById('itemModalLabel').innerText = '<?= __('edit_item') ?>';
if (item.image_url) {
document.getElementById('imagePreview').src = item.image_url;
document.getElementById('imagePreviewContainer').classList.remove('d-none');
}
modal.show();
new bootstrap.Modal(document.getElementById('itemModal')).show();
}
function editCategory(cat) {
document.getElementById('catFormLabel').innerText = "<?= __('edit_category') ?? 'Edit Category' ?>";
document.getElementById('catAction').value = 'edit_category';
document.getElementById('catId').value = cat.id;
document.getElementById('catNameEn').value = cat.name_en;
document.getElementById('catNameAr').value = cat.name_ar;
document.getElementById('cancelCatEdit').classList.remove('d-none');
}
function resetCatForm() {
document.getElementById('catFormLabel').innerText = "<?= __('add_new_category') ?>";
document.getElementById('catAction').value = 'add_category';
document.getElementById('categoryForm').reset();
document.getElementById('catId').value = '';
document.getElementById('cancelCatEdit').classList.add('d-none');
}
function editService(svc) {
document.getElementById('svcFormLabel').innerText = "<?= __('edit_service') ?? 'Edit Service' ?>";
document.getElementById('svcAction').value = 'edit_service';
document.getElementById('svcId').value = svc.id;
document.getElementById('svcNameEn').value = svc.name_en;
document.getElementById('svcNameAr').value = svc.name_ar;
document.getElementById('cancelSvcEdit').classList.remove('d-none');
}
function resetSvcForm() {
document.getElementById('svcFormLabel').innerText = "<?= __('add_new_service') ?>";
document.getElementById('svcAction').value = 'add_service';
document.getElementById('serviceForm').reset();
document.getElementById('svcId').value = '';
document.getElementById('cancelSvcEdit').classList.add('d-none');
}
function confirmDelete(type, id) {
if (confirm("<?= __('are_you_sure') ?>")) {
function confirmDeleteAjax(type, id) {
if (confirm('<?= __('confirm_delete') ?>')) {
document.getElementById('deleteAction').value = 'delete_' + type;
document.getElementById('deleteId').value = id;
document.getElementById('deleteForm').submit();
}
}
async function confirmDeleteAjax(type, id) {
if (confirm("<?= __('are_you_sure') ?>")) {
const formData = new FormData();
formData.append('action', 'delete_' + type);
formData.append('id', id);
formData.append('ajax', '1');
try {
const response = await fetch('items.php', { method: 'POST', body: formData });
const data = await response.json();
if (data.success) {
if (type === 'category') document.getElementById('categoryTableBody').innerHTML = data.html;
if (type === 'service') document.getElementById('serviceTableBody').innerHTML = data.html;
} else {
alert(data.error || 'Failed to delete');
}
} catch (error) {
console.error('Error deleting:', error);
}
}
// Category AJAX
function editCategory(cat) {
document.getElementById('catAction').value = 'edit_category';
document.getElementById('catId').value = cat.id;
document.getElementById('catNameEn').value = cat.name_en;
document.getElementById('catNameAr').value = cat.name_ar;
document.getElementById('catSubmitBtn').innerText = '<?= __('save') ?>';
document.getElementById('catCancelBtn').classList.remove('d-none');
}
function resetCatForm() {
document.getElementById('categoryForm').reset();
document.getElementById('catAction').value = 'add_category';
document.getElementById('catSubmitBtn').innerText = '<?= __('add_category') ?>';
document.getElementById('catCancelBtn').classList.add('d-none');
}
// Category Form AJAX
document.getElementById('categoryForm').addEventListener('submit', async function(e) {
e.preventDefault();
const formData = new FormData(this);
@ -880,6 +799,23 @@ document.getElementById('categoryForm').addEventListener('submit', async functio
}
});
// Service AJAX
function editService(svc) {
document.getElementById('svcAction').value = 'edit_service';
document.getElementById('svcId').value = svc.id;
document.getElementById('svcNameEn').value = svc.name_en;
document.getElementById('svcNameAr').value = svc.name_ar;
document.getElementById('svcSubmitBtn').innerText = '<?= __('save') ?>';
document.getElementById('svcCancelBtn').classList.remove('d-none');
}
function resetSvcForm() {
document.getElementById('serviceForm').reset();
document.getElementById('svcAction').value = 'add_service';
document.getElementById('svcSubmitBtn').innerText = '<?= __('add_service') ?>';
document.getElementById('svcCancelBtn').classList.add('d-none');
}
// Service Form AJAX
document.getElementById('serviceForm').addEventListener('submit', async function(e) {
e.preventDefault();
@ -926,6 +862,7 @@ document.querySelectorAll('.price-input').forEach(input => {
}
} catch (error) {
console.error('Error updating price:', error);
alert('Error updating price: ' + error.message);
}
}, 500);
});
@ -955,4 +892,4 @@ document.getElementById('itemImageFile').addEventListener('change', function(e)
});
</script>
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<?php require_once __DIR__ . '/includes/footer.php'; ?>