Files
Ty Clifford b57091e4ad - initial
2026-04-24 08:41:52 -04:00

168 lines
10 KiB
PHP
Raw Permalink 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.
<?php
$adminTitle = 'Businesses';
include __DIR__.'/admin_header.php';
// Handle POST actions
if (isPost()) {
csrfCheck();
$act = p('_act');
if ($act === 'add' || $act === 'edit') {
$fields = [
'name' => ps('name'),
'slug' => ps('slug') ?: makeSlug(ps('name')),
'category_id' => (int)p('category_id'),
'subcategory' => ps('subcategory'),
'description' => ps('description'),
'address' => ps('address'),
'phone' => ps('phone'),
'email' => ps('email'),
'website' => ps('website'),
'lat' => (float)p('lat', 39.4364),
'lng' => (float)p('lng', -78.9762),
'is_active' => (int)p('is_active', 1),
'is_featured' => (int)p('is_featured', 0),
];
// Build hours JSON
$days = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
$hrs = [];
foreach ($days as $d) { $v = ps("hours_$d"); if ($v) $hrs[$d] = $v; }
$fields['hours'] = json_encode($hrs);
if (!$fields['name']) { flash('Business name is required.','error'); go('/admin/businesses.php'); }
if ($act === 'add') {
// Ensure unique slug
$base = $fields['slug']; $i = 0;
while (qval("SELECT id FROM businesses WHERE slug=?",[$fields['slug'].($i?"-$i":"")])) $i++;
$fields['slug'] .= $i ? "-$i" : "";
qrun("INSERT INTO businesses(name,slug,category_id,subcategory,description,address,phone,email,website,hours,lat,lng,is_active,is_featured)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)",array_values($fields));
flash('Business added!','success');
} else {
$id = (int)p('id');
// Check slug uniqueness excluding self
$base = $fields['slug']; $i = 0;
while (qval("SELECT id FROM businesses WHERE slug=? AND id!=?",[$fields['slug'].($i?"-$i":""),$id])) $i++;
$fields['slug'] .= $i ? "-$i" : "";
qrun("UPDATE businesses SET name=?,slug=?,category_id=?,subcategory=?,description=?,address=?,phone=?,email=?,website=?,hours=?,lat=?,lng=?,is_active=?,is_featured=? WHERE id=?",array_merge(array_values($fields),[$id]));
flash('Business updated!','success');
}
go('/admin/businesses.php');
}
if ($act === 'delete') {
$id = (int)p('id');
qrun("DELETE FROM businesses WHERE id=?",[$id]);
flash('Business deleted.','success');
go('/admin/businesses.php');
}
if ($act === 'toggle') {
$id = (int)p('id');
qrun("UPDATE businesses SET is_active = 1 - is_active WHERE id=?",[$id]);
go('/admin/businesses.php');
}
}
$editId = iget('edit');
$editing = $editId ? qone("SELECT * FROM businesses WHERE id=?",[$editId]) : null;
$cats = qall("SELECT * FROM categories ORDER BY sort_order");
$q = gs('q'); $page = max(1,iget('page')); $perPage = 25;
$where = $q ? "WHERE b.name LIKE ? OR b.address LIKE ?" : "";
$params = $q ? ["%$q%","%$q%"] : [];
$total = (int)qval("SELECT COUNT(*) FROM businesses b $where",$params);
$pages = max(1,(int)ceil($total/$perPage));
$page = min($page,$pages);
$offset = ($page-1)*$perPage;
$bizs = qall("SELECT b.*,c.name cat FROM businesses b LEFT JOIN categories c ON c.id=b.category_id $where ORDER BY b.name LIMIT $perPage OFFSET $offset",$params);
$days = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
?>
<?php adminTitle($editing ? 'Edit Business: '.e($editing['name']) : 'Manage Businesses') ?>
<!-- Add/Edit Form -->
<div class="ibox" style="border-color:var(--gold-d);margin-bottom:2rem">
<div class="ibox-title"><?=$editing ? '✏️ EDIT: '.strtoupper(e($editing['name'])) : ' ADD NEW BUSINESS'?></div>
<?php $h = $editing ? parseHours($editing['hours']) : []; ?>
<form method="POST">
<?=csrfField()?>
<input type="hidden" name="_act" value="<?=$editing?'edit':'add'?>">
<?php if($editing): ?><input type="hidden" name="id" value="<?=$editing['id']?>"><?php endif; ?>
<div class="form-row">
<div class="fg"><label class="flabel">BUSINESS NAME *</label><input type="text" name="name" class="finput" value="<?=e($editing['name']??'')?>" required></div>
<div class="fg"><label class="flabel">SLUG (auto-generated)</label><input type="text" name="slug" class="finput" value="<?=e($editing['slug']??'')?>" placeholder="auto-generated from name"></div>
</div>
<div class="form-row">
<div class="fg"><label class="flabel">CATEGORY</label><select name="category_id" class="fselect"><?php foreach($cats as $c): ?><option value="<?=$c['id']?>"<?=($editing['category_id']??0)==$c['id']?' selected':''?>><?=e($c['icon'].' '.$c['name'])?></option><?php endforeach; ?></select></div>
<div class="fg"><label class="flabel">SUBCATEGORY</label><input type="text" name="subcategory" class="finput" value="<?=e($editing['subcategory']??'')?>" placeholder="e.g. Italian Restaurant"></div>
</div>
<div class="fg"><label class="flabel">DESCRIPTION</label><textarea name="description" class="ftextarea" style="min-height:90px"><?=e($editing['description']??'')?></textarea></div>
<div class="form-row">
<div class="fg"><label class="flabel">ADDRESS</label><input type="text" name="address" class="finput" value="<?=e($editing['address']??'')?>"></div>
<div class="fg"><label class="flabel">PHONE</label><input type="text" name="phone" class="finput" value="<?=e($editing['phone']??'')?>"></div>
</div>
<div class="form-row">
<div class="fg"><label class="flabel">EMAIL</label><input type="email" name="email" class="finput" value="<?=e($editing['email']??'')?>"></div>
<div class="fg"><label class="flabel">WEBSITE</label><input type="text" name="website" class="finput" value="<?=e($editing['website']??'')?>" placeholder="example.com (no https://)"></div>
</div>
<div class="form-row">
<div class="fg"><label class="flabel">LATITUDE</label><input type="number" name="lat" class="finput" value="<?=e($editing['lat']??39.4364)?>" step="0.0001"></div>
<div class="fg"><label class="flabel">LONGITUDE</label><input type="number" name="lng" class="finput" value="<?=e($editing['lng']??-78.9762)?>" step="0.0001"></div>
</div>
<div style="margin-bottom:1rem">
<label class="flabel" style="margin-bottom:.6rem">HOURS OF OPERATION</label>
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.5rem">
<?php foreach($days as $d): ?>
<div style="display:flex;gap:.4rem;align-items:center">
<span style="font-family:'Oswald',sans-serif;font-size:.72rem;color:var(--gold);width:28px;flex-shrink:0"><?=$d?></span>
<input type="text" name="hours_<?=$d?>" class="finput" style="font-size:.8rem;padding:.4rem .6rem" value="<?=e($h[$d]??'')?>" placeholder="e.g. 9am5pm">
</div>
<?php endforeach; ?>
</div>
</div>
<div class="form-row" style="margin-bottom:.75rem">
<div class="fg"><label class="flabel">STATUS</label><select name="is_active" class="fselect"><option value="1"<?=($editing['is_active']??1)?'selected':''?>>Active</option><option value="0"<?=isset($editing)&&!$editing['is_active']?' selected':''?>>Inactive (hidden)</option></select></div>
<div class="fg"><label class="flabel">FEATURED</label><select name="is_featured" class="fselect"><option value="0"<?=!($editing['is_featured']??0)?' selected':''?>>Not Featured</option><option value="1"<?=($editing['is_featured']??0)?' selected':''?>>★ Featured</option></select></div>
</div>
<div class="flex-row">
<button type="submit" class="btn btn-primary"><?=$editing?'Update Business':'Add Business'?></button>
<?php if($editing): ?><a href="/admin/businesses.php" class="btn btn-secondary">Cancel</a><?php endif; ?>
</div>
</form>
</div>
<!-- Businesses list -->
<div class="admin-sec-title">ALL BUSINESSES (<?=$total?>)</div>
<form method="GET" style="display:flex;gap:.5rem;margin-bottom:1rem">
<input type="text" name="q" class="finput" style="max-width:300px" value="<?=e($q)?>" placeholder="Search businesses…">
<button type="submit" class="btn btn-secondary btn-sm">Search</button>
<?php if($q): ?><a href="/admin/businesses.php" class="btn btn-outline btn-sm">Clear</a><?php endif; ?>
</form>
<div class="tbl-wrap">
<table class="dtbl">
<thead><tr><th>NAME</th><th>CATEGORY</th><th>PHONE</th><th>STATUS</th><th>FEATURED</th><th>ACTIONS</th></tr></thead>
<tbody>
<?php foreach($bizs as $b): ?>
<tr>
<td><a href="/business.php?slug=<?=e($b['slug'])?>" class="td-name" target="_blank"><?=e($b['name'])?></a></td>
<td><span style="font-size:.78rem;color:var(--text-d)"><?=e($b['cat']??'—')?></span></td>
<td style="font-size:.8rem"><?=e($b['phone'])?></td>
<td><?=$b['is_active']?'<span class="badge badge-green">Active</span>':'<span class="badge badge-gray">Inactive</span>'?></td>
<td><?=$b['is_featured']?'<span class="badge badge-gold">★</span>':'—'?></td>
<td>
<div class="flex-row" style="gap:.3rem">
<a href="/admin/businesses.php?edit=<?=$b['id']?>" class="btn btn-xs btn-outline">✏️ Edit</a>
<form method="POST" style="display:inline"><?=csrfField()?><input type="hidden" name="_act" value="toggle"><input type="hidden" name="id" value="<?=$b['id']?>"><button class="btn btn-xs btn-secondary"><?=$b['is_active']?'Deactivate':'Activate'?></button></form>
<form method="POST" style="display:inline"><?=csrfField()?><input type="hidden" name="_act" value="delete"><input type="hidden" name="id" value="<?=$b['id']?>"><button class="btn btn-xs btn-danger" data-confirm="Permanently delete '<?=e($b['name'])?>' and all its data? This cannot be undone.">🗑️ Delete</button></form>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php if($pages>1): ?>
<div style="display:flex;gap:.5rem;margin-top:1rem;flex-wrap:wrap">
<?php for($i=1;$i<=$pages;$i++): ?><a href="?<?=http_build_query(array_filter(['q'=>$q,'page'=>$i]))?>" class="btn btn-sm<?=$i===$page?' btn-primary':' btn-outline'?>"><?=$i?></a><?php endfor; ?>
</div>
<?php endif; ?>
<?php include __DIR__.'/admin_footer.php'; ?>