222 lines
10 KiB
PHP
222 lines
10 KiB
PHP
<?php
|
|
$headerStyle = 'light';
|
|
$rootPath = dirname(dirname(__DIR__));
|
|
include_once($rootPath . '/header.php');
|
|
checkAdmin();
|
|
|
|
$course_id = $_GET['course_id'] ?? null;
|
|
$course = null;
|
|
|
|
// If editing an existing course, fetch its data
|
|
if ($course_id) {
|
|
$stmt = $conn->prepare("SELECT * FROM courses WHERE course_id = ?");
|
|
$stmt->bind_param("i", $course_id);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
if ($result->num_rows > 0) {
|
|
$course = $result->fetch_assoc();
|
|
}
|
|
$stmt->close();
|
|
}
|
|
?>
|
|
|
|
<?php
|
|
$pageTitle = $course ? 'Edit Course' : 'Create New Course';
|
|
$breadcrumbs = [['Home' => 'index'], ['Admin' => 'admin_courses'], [$pageTitle => '']];
|
|
require_once($rootPath . '/components/banner.php');
|
|
?>
|
|
|
|
<!-- Course Manager Area start -->
|
|
<section class="trip-manager-area py-100 rel z-1">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="comment-form bgc-lighter z-1 rel mb-30 rmb-55">
|
|
<form id="courseForm" method="POST" action="process_course">
|
|
<input type="hidden" name="csrf_token" value="<?php echo generateCSRFToken(); ?>">
|
|
<?php if ($course): ?>
|
|
<input type="hidden" name="course_id" value="<?php echo $course['course_id']; ?>">
|
|
<?php endif; ?>
|
|
|
|
<div class="section-title py-20">
|
|
<h2><?php echo $course ? 'Edit Course: ' . htmlspecialchars($course['code'] ?: $course['course_type']) : 'Create New Course'; ?></h2>
|
|
<div id="responseMessage"></div>
|
|
</div>
|
|
|
|
<div class="row mt-35">
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="course_type">Course Type *</label>
|
|
<select id="course_type" name="course_type" class="form-control" required>
|
|
<?php
|
|
$types = ['driver_training' => 'Driver Training', 'bush_mechanics' => 'Bush Mechanics', 'rescue_recovery' => 'Rescue & Recovery', 'ladies_driver_training' => 'Ladies Driver Training'];
|
|
foreach ($types as $key => $label) {
|
|
$sel = ($course && $course['course_type'] === $key) ? 'selected' : '';
|
|
echo "<option value=\"$key\" $sel>$label</option>";
|
|
}
|
|
?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="code">Course Code</label>
|
|
<input type="text" id="code" name="code" class="form-control" maxlength="12" value="<?php echo $course ? htmlspecialchars($course['code']) : ''; ?>" placeholder="Optional code e.g., CRSE001" data-manual="0">
|
|
<small class="form-text text-muted">Auto-generated from type + date (you can edit manually)</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="date">Date *</label>
|
|
<input type="date" id="date" name="date" class="form-control" value="<?php echo $course ? $course['date'] : ''; ?>" required>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="capacity">Capacity *</label>
|
|
<input type="number" id="capacity" name="capacity" class="form-control" min="1" value="<?php echo $course ? intval($course['capacity']) : ''; ?>" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="cost_members">Member Cost (R) *</label>
|
|
<input type="number" id="cost_members" name="cost_members" class="form-control" step="0.01" min="0" value="<?php echo $course ? $course['cost_members'] : ''; ?>" required>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="cost_nonmembers">Non-Member Cost (R) *</label>
|
|
<input type="number" id="cost_nonmembers" name="cost_nonmembers" class="form-control" step="0.01" min="0" value="<?php echo $course ? $course['cost_nonmembers'] : ''; ?>" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="instructor">Instructor *</label>
|
|
<input type="text" id="instructor" name="instructor" class="form-control" value="<?php echo $course ? htmlspecialchars($course['instructor']) : ''; ?>" required>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="instructor_email">Instructor Email</label>
|
|
<input type="email" id="instructor_email" name="instructor_email" class="form-control" value="<?php echo $course ? htmlspecialchars($course['instructor_email']) : ''; ?>">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-12 mt-20">
|
|
<div class="form-group mb-0">
|
|
<button type="submit" class="theme-btn style-two" style="width:100%;">
|
|
<?php echo $course ? 'Update Course' : 'Create Course'; ?>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<!-- Course Manager Area end -->
|
|
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
|
<script>
|
|
$(document).ready(function() {
|
|
$('#courseForm').on('submit', function(event) {
|
|
event.preventDefault();
|
|
var formData = $(this).serialize();
|
|
|
|
$.ajax({
|
|
url: 'process_course',
|
|
type: 'POST',
|
|
data: formData,
|
|
dataType: 'json',
|
|
success: function(response) {
|
|
if (response.status === 'success') {
|
|
$('#responseMessage').html('<div class="alert alert-success">' + response.message + '</div>');
|
|
setTimeout(function() {
|
|
window.location.href = 'admin_courses';
|
|
}, 1200);
|
|
} else {
|
|
$('#responseMessage').html('<div class="alert alert-danger">' + response.message + '</div>');
|
|
}
|
|
},
|
|
error: function(xhr, status, error) {
|
|
console.error('AJAX Error:', error);
|
|
$('#responseMessage').html('<div class="alert alert-danger">Error creating/updating course: ' + error + '</div>');
|
|
}
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
// Auto-generate course code from type and date: ABBREVIATION_MMDD
|
|
(function(){
|
|
var typeMap = {
|
|
'driver_training': 'DRVTRN',
|
|
'bush_mechanics': 'BUSHMEC',
|
|
'rescue_recovery': 'RESREC',
|
|
'ladies_driver_training': 'LADYTRN'
|
|
};
|
|
|
|
var $type = document.getElementById('course_type');
|
|
var $date = document.getElementById('date');
|
|
var $code = document.getElementById('code');
|
|
|
|
function getMMDDFromISO(isoDate) {
|
|
if (!isoDate) return '';
|
|
// expecting YYYY-MM-DD
|
|
var parts = isoDate.split('-');
|
|
if (parts.length !== 3) return '';
|
|
return parts[1] + parts[2];
|
|
}
|
|
|
|
function generateCode() {
|
|
try {
|
|
var manual = $code.getAttribute('data-manual') === '1';
|
|
if (manual) return; // user has manually edited
|
|
var t = $type.value;
|
|
var d = $date.value;
|
|
if (!t || !d) return;
|
|
var abbr = typeMap[t] || t.toUpperCase().replace(/[^A-Z0-9]/g,'').substring(0,7);
|
|
var mmdd = getMMDDFromISO(d);
|
|
if (!mmdd) return;
|
|
var newCode = abbr + '_' + mmdd;
|
|
$code.value = newCode;
|
|
} catch (e) {
|
|
console.error('generateCode error', e);
|
|
}
|
|
}
|
|
|
|
// mark manual when user types
|
|
$code.addEventListener('input', function(){
|
|
var val = $code.value.trim();
|
|
if (val.length === 0) {
|
|
$code.setAttribute('data-manual','0');
|
|
} else {
|
|
// if value matches auto pattern for currently selected type+date, keep as auto; otherwise mark manual
|
|
var expected = '';
|
|
try { expected = (typeMap[$type.value] || $type.value.toUpperCase().replace(/[^A-Z0-9]/g,'').substring(0,7)) + '_' + ( ($date.value) ? $date.value.split('-')[1] + $date.value.split('-')[2] : '' ); } catch(e){ expected=''; }
|
|
if (val === expected) {
|
|
$code.setAttribute('data-manual','0');
|
|
} else {
|
|
$code.setAttribute('data-manual','1');
|
|
}
|
|
}
|
|
});
|
|
|
|
$type.addEventListener('change', generateCode);
|
|
$date.addEventListener('change', generateCode);
|
|
|
|
// generate on load if empty
|
|
if ($code.value.trim().length === 0) {
|
|
generateCode();
|
|
}
|
|
})();
|
|
</script>
|
|
|
|
<?php include_once($rootPath . '/components/insta_footer.php'); ?>
|