- initial

This commit is contained in:
Ty Clifford
2026-04-24 08:41:52 -04:00
commit b57091e4ad
49 changed files with 7371 additions and 0 deletions
+167
View File
@@ -0,0 +1,167 @@
<?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'; ?>