<?php
$pageTitle = "Manage Canned Responses";
include_once('includes/header.php');
include_once('includes/check_login.php');
// Check if admins table exists
$admins_table_check = $conn->query("SHOW TABLES LIKE 'admins'");
$has_admins_table = ($admins_table_check->num_rows > 0);
// Create canned responses table if not exists
$conn->query("
CREATE TABLE IF NOT EXISTS `support_canned_responses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`message` text NOT NULL,
`category` varchar(50) DEFAULT NULL,
`created_by` int(11) DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
// Handle form submission for adding/editing canned response
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_response'])) {
$title = isset($_POST['title']) ? trim($conn->real_escape_string($_POST['title'])) : '';
$message = isset($_POST['message']) ? trim($conn->real_escape_string($_POST['message'])) : '';
$category = isset($_POST['category']) ? trim($conn->real_escape_string($_POST['category'])) : '';
$response_id = isset($_POST['response_id']) ? (int)$_POST['response_id'] : 0;
if (empty($title) || empty($message)) {
$_SESSION['error_msg'] = "Title and message are required fields.";
} else {
if ($response_id > 0) {
// Update existing response
$stmt = $conn->prepare("
UPDATE support_canned_responses
SET title = ?, message = ?, category = ?
WHERE id = ?
");
$stmt->bind_param("sssi", $title, $message, $category, $response_id);
if ($stmt->execute()) {
$_SESSION['success_msg'] = "Canned response updated successfully.";
} else {
$_SESSION['error_msg'] = "Failed to update canned response.";
}
} else {
// Add new response
$admin_id = isset($_SESSION['admin_id']) ? $_SESSION['admin_id'] : NULL;
// Add new response - handle case where created_by might not be required
if ($has_admins_table && $admin_id) {
$stmt = $conn->prepare("
INSERT INTO support_canned_responses
(title, message, category, created_by)
VALUES (?, ?, ?, ?)
");
$stmt->bind_param("sssi", $title, $message, $category, $admin_id);
} else {
$stmt = $conn->prepare("
INSERT INTO support_canned_responses
(title, message, category)
VALUES (?, ?, ?)
");
$stmt->bind_param("sss", $title, $message, $category);
}
if ($stmt->execute()) {
$_SESSION['success_msg'] = "Canned response added successfully.";
} else {
$_SESSION['error_msg'] = "Failed to add canned response.";
}
}
// Redirect to avoid form resubmission
header("Location: canned_responses.php");
exit();
}
}
// Handle delete request
if (isset($_GET['delete']) && is_numeric($_GET['delete'])) {
$response_id = (int)$_GET['delete'];
$stmt = $conn->prepare("DELETE FROM support_canned_responses WHERE id = ?");
$stmt->bind_param("i", $response_id);
if ($stmt->execute()) {
$_SESSION['success_msg'] = "Canned response deleted successfully.";
} else {
$_SESSION['error_msg'] = "Failed to delete canned response.";
}
header("Location: canned_responses.php");
exit();
}
// Get response details if editing
$response = null;
if (isset($_GET['edit']) && is_numeric($_GET['edit'])) {
$response_id = (int)$_GET['edit'];
$stmt = $conn->prepare("SELECT * FROM support_canned_responses WHERE id = ?");
$stmt->bind_param("i", $response_id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$response = $result->fetch_assoc();
}
}
// Fetch all canned responses
$responses = [];
$category_filter = isset($_GET['category']) ? $conn->real_escape_string($_GET['category']) : '';
// Modify query based on whether admins table exists
if ($has_admins_table) {
$query = "SELECT r.*, a.name as admin_name FROM support_canned_responses r
LEFT JOIN admins a ON r.created_by = a.id";
} else {
$query = "SELECT r.* FROM support_canned_responses r";
}
if (!empty($category_filter)) {
$query .= " WHERE r.category = '$category_filter'";
}
$query .= " ORDER BY r.title ASC";
$result = $conn->query($query);
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$responses[] = $row;
}
}
// Get unique categories
$categories = [];
$result = $conn->query("SELECT DISTINCT category FROM support_canned_responses WHERE category != '' ORDER BY category");
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$categories[] = $row['category'];
}
}
// Define support categories
$support_categories = [
'account' => 'Account Access',
'payment' => 'Payment Issues',
'enrollment' => 'Course Enrollment',
'certificate' => 'Certificate Issues',
'exam' => 'Exam Related',
'technical' => 'Technical Support',
'general' => 'General Information',
'other' => 'Other'
];
?>
<div class="container-fluid py-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="h3">Manage Canned Responses</h2>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#responseModal">
<i class="fas fa-plus me-1"></i> Add New Response
</button>
</div>
<?php if (isset($_SESSION['success_msg'])): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo $_SESSION['success_msg']; unset($_SESSION['success_msg']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['error_msg'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo $_SESSION['error_msg']; unset($_SESSION['error_msg']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<!-- Filter bar -->
<div class="card mb-4">
<div class="card-body">
<form method="get" action="" class="row g-3">
<div class="col-md-4">
<label for="category" class="form-label">Filter by Category</label>
<select class="form-select" name="category" id="category" onchange="this.form.submit()">
<option value="">All Categories</option>
<?php foreach ($support_categories as $key => $label): ?>
<option value="<?php echo $key; ?>" <?php echo $category_filter === $key ? 'selected' : ''; ?>>
<?php echo $label; ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-8 d-flex align-items-end">
<div class="ms-auto">
<?php if (!empty($category_filter)): ?>
<a href="canned_responses.php" class="btn btn-outline-secondary">
<i class="fas fa-times me-1"></i> Clear Filter
</a>
<?php endif; ?>
</div>
</div>
</form>
</div>
</div>
<!-- Responses table -->
<div class="card">
<div class="card-body">
<?php if (count($responses) > 0): ?>
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th width="30%">Title</th>
<th width="20%">Category</th>
<th width="30%">Preview</th>
<th width="10%">Created By</th>
<th width="10%">Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($responses as $item): ?>
<tr>
<td><?php echo htmlspecialchars($item['title']); ?></td>
<td>
<?php if (!empty($item['category'])): ?>
<span class="badge bg-info">
<?php echo isset($support_categories[$item['category']]) ?
htmlspecialchars($support_categories[$item['category']]) :
htmlspecialchars($item['category']); ?>
</span>
<?php else: ?>
<span class="text-muted">Not categorized</span>
<?php endif; ?>
</td>
<td>
<div class="text-truncate" style="max-width: 300px;">
<?php echo htmlspecialchars(substr($item['message'], 0, 100)) . (strlen($item['message']) > 100 ? '...' : ''); ?>
</div>
</td>
<td><?php echo isset($item['admin_name']) ? htmlspecialchars($item['admin_name']) : 'N/A'; ?></td>
<td>
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-primary preview-btn"
data-title="<?php echo htmlspecialchars($item['title']); ?>"
data-message="<?php echo htmlspecialchars($item['message']); ?>">
<i class="fas fa-eye"></i>
</button>
<a href="canned_responses.php?edit=<?php echo $item['id']; ?>" class="btn btn-sm btn-outline-secondary">
<i class="fas fa-edit"></i>
</a>
<a href="canned_responses.php?delete=<?php echo $item['id']; ?>"
class="btn btn-sm btn-outline-danger"
onclick="return confirm('Are you sure you want to delete this canned response?')">
<i class="fas fa-trash"></i>
</a>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php else: ?>
<div class="alert alert-info mb-0">
<i class="fas fa-info-circle me-2"></i> No canned responses found.
<?php if (!empty($category_filter)): ?>
<a href="canned_responses.php">Clear the filter</a> to see all responses.
<?php else: ?>
Click the "Add New Response" button to create your first canned response.
<?php endif; ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
<!-- Response Modal -->
<div class="modal fade" id="responseModal" tabindex="-1" aria-labelledby="responseModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form method="post" action="">
<div class="modal-header">
<h5 class="modal-title" id="responseModalLabel">
<?php echo $response ? 'Edit Canned Response' : 'Add New Canned Response'; ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<?php if ($response): ?>
<input type="hidden" name="response_id" value="<?php echo $response['id']; ?>">
<?php endif; ?>
<div class="mb-3">
<label for="title" class="form-label">Title</label>
<input type="text" class="form-control" id="title" name="title"
value="<?php echo $response ? htmlspecialchars($response['title']) : ''; ?>" required>
<div class="form-text">A descriptive name for this response (visible to admins only)</div>
</div>
<div class="mb-3">
<label for="category" class="form-label">Category</label>
<select class="form-select" id="category" name="category">
<option value="">Select Category</option>
<?php foreach ($support_categories as $key => $label): ?>
<option value="<?php echo $key; ?>" <?php echo ($response && $response['category'] === $key) ? 'selected' : ''; ?>>
<?php echo $label; ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label for="message" class="form-label">Response Message</label>
<textarea class="form-control" id="message" name="message" rows="10" required><?php echo $response ? htmlspecialchars($response['message']) : ''; ?></textarea>
<div class="form-text">
You can use the following placeholders in your message:
<ul class="mb-0 ps-3 mt-1">
<li><code>{student_name}</code> - Student's name</li>
<li><code>{ticket_number}</code> - Support ticket number</li>
<li><code>{course_name}</code> - Course name (if applicable)</li>
</ul>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" name="save_response" class="btn btn-primary">Save Response</button>
</div>
</form>
</div>
</div>
</div>
<!-- Preview Modal -->
<div class="modal fade" id="previewModal" tabindex="-1" aria-labelledby="previewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="previewModalLabel">Response Preview</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<h6 class="preview-title fw-bold"></h6>
<hr>
<div class="preview-message"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Show edit modal on page load if editing
<?php if ($response): ?>
var responseModal = new bootstrap.Modal(document.getElementById('responseModal'));
responseModal.show();
<?php endif; ?>
// Handle preview buttons
const previewButtons = document.querySelectorAll('.preview-btn');
const previewModal = new bootstrap.Modal(document.getElementById('previewModal'));
const previewTitle = document.querySelector('.preview-title');
const previewMessage = document.querySelector('.preview-message');
previewButtons.forEach(button => {
button.addEventListener('click', function() {
const title = this.getAttribute('data-title');
const message = this.getAttribute('data-message');
previewTitle.textContent = title;
previewMessage.innerHTML = message.replace(/\n/g, '<br>');
previewModal.show();
});
});
});
</script>
<?php include_once('includes/footer.php'); ?>