Files
2026-06-19 12:03:13 -04:00

284 lines
17 KiB
PHP

<?php
require_once dirname(__DIR__).'/includes/boot.php';
requireAdmin();
$adminTitle = 'Site Settings';
if (isPost()) {
csrfCheck();
$act = p('_act');
if ($act === 'settings') {
setSetting('site_name', ps('site_name'));
setSetting('site_tagline', ps('site_tagline'));
setSetting('contact_email', ps('contact_email'));
setSetting('registration_enabled',p('registration_enabled','0'));
setSetting('events_require_approval',p('events_require_approval','0'));
setSetting('home_random_interval',p('home_random_interval','2hours') === 'day' ? 'day' : '2hours');
if (array_key_exists('event_upload_max_mb', $_POST)) {
setSetting('event_upload_max_mb', (string)max(1, (float)p('event_upload_max_mb','5')));
setSetting('menu_item_image_limit', (string)max(0, min(1, (int)p('menu_item_image_limit','1'))));
setSetting('menu_upload_max_mb', (string)max(1, (float)p('menu_upload_max_mb','5')));
setSetting('forum_image_resize_threshold_mb', (string)max(0.5, (float)p('forum_image_resize_threshold_mb','1')));
setSetting('forum_image_max_width', (string)max(640, min(3200, (int)p('forum_image_max_width','1600'))));
setSetting('forum_image_quality', (string)max(40, min(95, (int)p('forum_image_quality','82'))));
}
if (array_key_exists('mailgun_domain', $_POST)) {
setSetting('site_base_url', rtrim(ps('site_base_url'), '/'));
setSetting('mailgun_region', p('mailgun_region','us') === 'eu' ? 'eu' : 'us');
setSetting('mailgun_domain', ps('mailgun_domain'));
setSetting('mailgun_from_name', ps('mailgun_from_name') ?: 'Discover Keyser WV');
setSetting('mailgun_from_email', ps('mailgun_from_email'));
setSetting('mailgun_send_mode', p('mailgun_send_mode','html') === 'text' ? 'text' : 'html');
if (p('clear_mailgun_api_key','0') === '1') {
setSetting('mailgun_api_key', '');
} elseif (ps('mailgun_api_key') !== '') {
setSetting('mailgun_api_key', ps('mailgun_api_key'));
}
}
flash('Settings saved!','success');
go('/admin/settings.php');
}
// Change admin password
if ($act === 'change_password') {
$pw = ps('new_password');
$pw2 = ps('confirm_password');
if (strlen($pw) < 6) { flash('Password must be at least 6 characters.','error'); go('/admin/settings.php'); }
if ($pw !== $pw2) { flash('Passwords do not match.','error'); go('/admin/settings.php'); }
qrun("UPDATE users SET password=? WHERE id=?",[password_hash($pw,PASSWORD_BCRYPT),uid()]);
flash('Password updated successfully!','success');
go('/admin/settings.php');
}
}
$regEnabled = setting('registration_enabled','1');
$evtApproval = setting('events_require_approval','1');
$siteName = setting('site_name','Discover Keyser WV');
$siteTagline = setting('site_tagline','The Friendliest City in the U.S.A.');
$contactEmail = setting('contact_email','info@discoverkeyser.com');
$homeRandomInterval = setting('home_random_interval','2hours');
$siteBaseUrl = setting('site_base_url','');
$mailgunRegion = setting('mailgun_region','us');
$mailgunDomain = setting('mailgun_domain','');
$mailgunFromName = setting('mailgun_from_name','Discover Keyser WV');
$mailgunFromEmail = setting('mailgun_from_email','');
$mailgunSendMode = setting('mailgun_send_mode','html');
$mailgunHasKey = setting('mailgun_api_key','') !== '';
$eventUploadMax = setting('event_upload_max_mb','5');
$menuImageLimit = setting('menu_item_image_limit','1');
$menuUploadMax = setting('menu_upload_max_mb','5');
$resizeThreshold = setting('forum_image_resize_threshold_mb','1');
$resizeMaxWidth = setting('forum_image_max_width','1600');
$resizeQuality = setting('forum_image_quality','82');
$me = qone("SELECT * FROM users WHERE id=?",[uid()]);
include __DIR__.'/admin_header.php';
?>
<?php adminTitle('Site Settings') ?>
<div class="g2" style="gap:1.5rem">
<!-- General settings -->
<div>
<div class="ibox" style="border-color:var(--gold-d)">
<div class="ibox-title">🌐 GENERAL SETTINGS</div>
<form method="POST"><?=csrfField()?><input type="hidden" name="_act" value="settings">
<div class="fg"><label class="flabel">SITE NAME</label><input type="text" name="site_name" class="finput" value="<?=e($siteName)?>"></div>
<div class="fg"><label class="flabel">SITE TAGLINE</label><input type="text" name="site_tagline" class="finput" value="<?=e($siteTagline)?>"></div>
<div class="fg"><label class="flabel">CONTACT EMAIL</label><input type="email" name="contact_email" class="finput" value="<?=e($contactEmail)?>"></div>
<hr class="divider" style="margin:1rem 0">
<div class="fg">
<label class="flabel">USER REGISTRATION</label>
<div style="display:flex;gap:1rem;margin-top:.4rem">
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem">
<input type="radio" name="registration_enabled" value="1"<?=$regEnabled==='1'?' checked':''?>>
<span style="color:var(--green-l)">✅ Enabled — users can register</span>
</label>
</div>
<div style="display:flex;gap:1rem;margin-top:.4rem">
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem">
<input type="radio" name="registration_enabled" value="0"<?=$regEnabled==='0'?' checked':''?>>
<span style="color:var(--red-l)">🔒 Disabled — registration closed</span>
</label>
</div>
<div class="fhint">When disabled, the Sign Up link is hidden and registration page shows a message.</div>
</div>
<div class="fg">
<label class="flabel">EVENT SUBMISSIONS</label>
<div style="margin-top:.4rem">
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem;margin-bottom:.35rem">
<input type="radio" name="events_require_approval" value="1"<?=$evtApproval==='1'?' checked':''?>>
<span>Require admin approval before events go public</span>
</label>
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem">
<input type="radio" name="events_require_approval" value="0"<?=$evtApproval==='0'?' checked':''?>>
<span>Auto-approve all submitted events</span>
</label>
</div>
</div>
<div class="fg">
<label class="flabel">HOMEPAGE RANDOM BUSINESS ROTATION</label>
<div style="margin-top:.4rem">
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem;margin-bottom:.35rem">
<input type="radio" name="home_random_interval" value="2hours"<?=$homeRandomInterval==='2hours'?' checked':''?>>
<span>Refresh the random list every two hours</span>
</label>
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem">
<input type="radio" name="home_random_interval" value="day"<?=$homeRandomInterval==='day'?' checked':''?>>
<span>Refresh the random list once per day</span>
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Save Settings</button>
</form>
</div>
<div class="ibox" style="border-color:var(--gold-d)">
<div class="ibox-title">🖼️ UPLOAD &amp; IMAGE SETTINGS</div>
<form method="POST"><?=csrfField()?><input type="hidden" name="_act" value="settings">
<input type="hidden" name="site_name" value="<?=e($siteName)?>">
<input type="hidden" name="site_tagline" value="<?=e($siteTagline)?>">
<input type="hidden" name="contact_email" value="<?=e($contactEmail)?>">
<input type="hidden" name="registration_enabled" value="<?=e($regEnabled)?>">
<input type="hidden" name="events_require_approval" value="<?=e($evtApproval)?>">
<input type="hidden" name="home_random_interval" value="<?=e($homeRandomInterval)?>">
<div class="form-row">
<div class="fg"><label class="flabel">EVENT IMAGE MAX MB</label><input type="number" name="event_upload_max_mb" class="finput" min="1" step="0.5" value="<?=e($eventUploadMax)?>"></div>
<div class="fg"><label class="flabel">MENU IMAGE MAX MB</label><input type="number" name="menu_upload_max_mb" class="finput" min="1" step="0.5" value="<?=e($menuUploadMax)?>"></div>
</div>
<div class="form-row">
<div class="fg">
<label class="flabel">MENU ITEM IMAGE LIMIT</label>
<select name="menu_item_image_limit" class="fselect">
<option value="1"<?=$menuImageLimit==='1'?' selected':''?>>One image per item</option>
<option value="0"<?=$menuImageLimit==='0'?' selected':''?>>No menu item images</option>
</select>
</div>
</div>
<hr class="divider" style="margin:1rem 0">
<div class="form-row">
<div class="fg"><label class="flabel">RESIZE IMAGES OVER MB</label><input type="number" name="forum_image_resize_threshold_mb" class="finput" min="0.5" step="0.5" value="<?=e($resizeThreshold)?>"></div>
<div class="fg"><label class="flabel">MAX IMAGE WIDTH</label><input type="number" name="forum_image_max_width" class="finput" min="640" max="3200" step="80" value="<?=e($resizeMaxWidth)?>"></div>
</div>
<div class="fg"><label class="flabel">IMAGE QUALITY</label><input type="number" name="forum_image_quality" class="finput" min="40" max="95" value="<?=e($resizeQuality)?>"><div class="fhint">Used when large uploaded images are re-saved.</div></div>
<button type="submit" class="btn btn-primary">Save Upload Settings</button>
</form>
</div>
<div class="ibox" style="border-color:var(--gold-d)">
<div class="ibox-title">✉️ EMAIL VERIFICATION &amp; MAILGUN</div>
<form method="POST"><?=csrfField()?><input type="hidden" name="_act" value="settings">
<input type="hidden" name="site_name" value="<?=e($siteName)?>">
<input type="hidden" name="site_tagline" value="<?=e($siteTagline)?>">
<input type="hidden" name="contact_email" value="<?=e($contactEmail)?>">
<input type="hidden" name="registration_enabled" value="<?=e($regEnabled)?>">
<input type="hidden" name="events_require_approval" value="<?=e($evtApproval)?>">
<input type="hidden" name="home_random_interval" value="<?=e($homeRandomInterval)?>">
<input type="hidden" name="event_upload_max_mb" value="<?=e($eventUploadMax)?>">
<input type="hidden" name="menu_item_image_limit" value="<?=e($menuImageLimit)?>">
<input type="hidden" name="menu_upload_max_mb" value="<?=e($menuUploadMax)?>">
<input type="hidden" name="forum_image_resize_threshold_mb" value="<?=e($resizeThreshold)?>">
<input type="hidden" name="forum_image_max_width" value="<?=e($resizeMaxWidth)?>">
<input type="hidden" name="forum_image_quality" value="<?=e($resizeQuality)?>">
<div class="fg">
<label class="flabel">SITE BASE URL</label>
<input type="url" name="site_base_url" class="finput" value="<?=e($siteBaseUrl)?>" placeholder="https://discoverkeyser.com">
<div class="fhint">Used to build verification links. Leave blank to detect the current host.</div>
</div>
<div class="form-row">
<div class="fg">
<label class="flabel">MAILGUN REGION</label>
<select name="mailgun_region" class="fselect">
<option value="us"<?=$mailgunRegion==='us'?' selected':''?>>US API (api.mailgun.net)</option>
<option value="eu"<?=$mailgunRegion==='eu'?' selected':''?>>EU API (api.eu.mailgun.net)</option>
</select>
</div>
<div class="fg">
<label class="flabel">MAILGUN DOMAIN</label>
<input type="text" name="mailgun_domain" class="finput" value="<?=e($mailgunDomain)?>" placeholder="mg.example.com">
</div>
</div>
<div class="form-row">
<div class="fg">
<label class="flabel">FROM NAME</label>
<input type="text" name="mailgun_from_name" class="finput" value="<?=e($mailgunFromName)?>" placeholder="Discover Keyser WV">
</div>
<div class="fg">
<label class="flabel">FROM EMAIL</label>
<input type="email" name="mailgun_from_email" class="finput" value="<?=e($mailgunFromEmail)?>" placeholder="hello@mg.example.com">
</div>
</div>
<div class="fg">
<label class="flabel">MAILGUN API KEY</label>
<input type="password" name="mailgun_api_key" class="finput" value="" placeholder="<?=$mailgunHasKey?'Key saved - leave blank to keep it':'Enter Mailgun API key'?>">
<div class="fhint"><?=$mailgunHasKey?'An API key is saved. Enter a new key to replace it.':'No API key is saved yet.'?></div>
<?php if($mailgunHasKey): ?>
<label style="display:flex;align-items:center;gap:.45rem;margin-top:.55rem;font-size:.85rem;color:var(--text-m);cursor:pointer">
<input type="checkbox" name="clear_mailgun_api_key" value="1"> Clear saved API key
</label>
<?php endif; ?>
</div>
<div class="fg">
<label class="flabel">EMAIL SEND FORMAT</label>
<div style="margin-top:.4rem">
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem;margin-bottom:.35rem">
<input type="radio" name="mailgun_send_mode" value="html"<?=$mailgunSendMode==='html'?' checked':''?>>
<span>Designed HTML email with text fallback</span>
</label>
<label style="display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.9rem">
<input type="radio" name="mailgun_send_mode" value="text"<?=$mailgunSendMode==='text'?' checked':''?>>
<span>Simple text-only email</span>
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Save Email Settings</button>
</form>
</div>
</div>
<!-- Admin password change -->
<div>
<div class="ibox" style="border-color:var(--gold-d)">
<div class="ibox-title">🔑 CHANGE YOUR ADMIN PASSWORD</div>
<div class="irow"><span class="irow-i">👤</span><span class="irow-v"><?=e($me['username'])?> <span class="badge badge-gold">ADMIN</span></span></div>
<div class="irow" style="margin-bottom:1rem"><span class="irow-i">📅</span><span class="irow-v">Last login: <?=$me['last_login']?ago($me['last_login']):'—'?></span></div>
<form method="POST"><?=csrfField()?><input type="hidden" name="_act" value="change_password">
<div class="fg"><label class="flabel">NEW PASSWORD *</label><input type="password" name="new_password" class="finput" required autocomplete="new-password"><div class="fhint">Minimum 6 characters.</div></div>
<div class="fg"><label class="flabel">CONFIRM NEW PASSWORD *</label><input type="password" name="confirm_password" class="finput" required autocomplete="new-password"></div>
<button type="submit" class="btn btn-primary">Update Password</button>
</form>
</div>
<!-- DB info -->
<div class="ibox">
<div class="ibox-title">📊 DATABASE INFO</div>
<?php
$counts = [
'Businesses' => qval("SELECT COUNT(*) FROM businesses"),
'Users' => qval("SELECT COUNT(*) FROM users"),
'Reviews' => qval("SELECT COUNT(*) FROM reviews"),
'Events' => qval("SELECT COUNT(*) FROM events"),
'Attractions'=> qval("SELECT COUNT(*) FROM attractions"),
'Alerts' => qval("SELECT COUNT(*) FROM alerts"),
'Reports' => qval("SELECT COUNT(*) FROM reports"),
'Menu Sections'=> qval("SELECT COUNT(*) FROM menu_sections"),
'Menu Items' => qval("SELECT COUNT(*) FROM menu_items"),
];
foreach ($counts as $lbl => $n):
?><div class="irow"><span class="irow-i">📌</span><span class="irow-v" style="display:flex;justify-content:space-between;width:100%"><span><?=e($lbl)?></span><strong style="color:var(--gold)"><?=$n?></strong></span></div><?php endforeach; ?>
<?php if(file_exists(DB_FILE)): ?>
<div class="irow"><span class="irow-i">💾</span><span class="irow-v" style="display:flex;justify-content:space-between;width:100%"><span>DB File Size</span><strong style="color:var(--gold)"><?=number_format(filesize(DB_FILE)/1024,1)?> KB</strong></span></div>
<?php endif; ?>
</div>
</div>
</div>
<?php include __DIR__.'/admin_footer.php'; ?>