diff --git a/api/get_template.php b/api/get_template.php new file mode 100644 index 0000000..cd0da47 --- /dev/null +++ b/api/get_template.php @@ -0,0 +1,45 @@ + false, 'error' => 'Not authenticated']); + exit; +} + +// Get template ID from query parameter +$templateId = $_GET['template_id'] ?? null; + +if (!$templateId) { + echo json_encode(['success' => false, 'error' => 'Template ID required']); + exit; +} + +// Create database connection +$conn = new mysqli( + $GLOBALS['config']['DB_HOST'], + $GLOBALS['config']['DB_USER'], + $GLOBALS['config']['DB_PASS'], + $GLOBALS['config']['DB_NAME'] +); + +if ($conn->connect_error) { + echo json_encode(['success' => false, 'error' => 'Database connection failed']); + exit; +} + +// Get template +$templateModel = new TemplateModel($conn); +$template = $templateModel->getTemplateById($templateId); + +$conn->close(); + +if ($template) { + echo json_encode(['success' => true, 'template' => $template]); +} else { + echo json_encode(['success' => false, 'error' => 'Template not found']); +} diff --git a/assets/js/dashboard.js b/assets/js/dashboard.js index 06c0708..33f1522 100644 --- a/assets/js/dashboard.js +++ b/assets/js/dashboard.js @@ -851,4 +851,65 @@ function saveTicket() { } } }); -} \ No newline at end of file +} +/** + * Load template data into the create ticket form + */ +function loadTemplate() { + const templateSelect = document.getElementById('templateSelect'); + const templateId = templateSelect.value; + + if (!templateId) { + // Clear form when "No Template" is selected + document.getElementById('title').value = ''; + document.getElementById('description').value = ''; + document.getElementById('priority').value = '4'; + document.getElementById('category').value = 'General'; + document.getElementById('type').value = 'Issue'; + return; + } + + // Fetch template data + fetch(`/api/get_template.php?template_id=${templateId}`) + .then(response => { + if (!response.ok) { + throw new Error('Failed to fetch template'); + } + return response.json(); + }) + .then(data => { + if (data.success && data.template) { + const template = data.template; + + // Populate form fields with template data + if (template.title_template) { + document.getElementById('title').value = template.title_template; + } + + if (template.description_template) { + document.getElementById('description').value = template.description_template; + } + + if (template.category) { + document.getElementById('category').value = template.category; + } + + if (template.type) { + document.getElementById('type').value = template.type; + } + + if (template.default_priority) { + document.getElementById('priority').value = template.default_priority; + } + + console.log('Template loaded:', template.template_name); + } else { + console.error('Failed to load template:', data.error); + alert('Failed to load template: ' + (data.error || 'Unknown error')); + } + }) + .catch(error => { + console.error('Error loading template:', error); + alert('Error loading template: ' + error.message); + }); +} diff --git a/controllers/TicketController.php b/controllers/TicketController.php index e2670dc..40d5cab 100644 --- a/controllers/TicketController.php +++ b/controllers/TicketController.php @@ -5,6 +5,7 @@ require_once dirname(__DIR__) . '/models/CommentModel.php'; require_once dirname(__DIR__) . '/models/AuditLogModel.php'; require_once dirname(__DIR__) . '/models/UserModel.php'; require_once dirname(__DIR__) . '/models/WorkflowModel.php'; +require_once dirname(__DIR__) . '/models/TemplateModel.php'; class TicketController { private $ticketModel; @@ -12,6 +13,7 @@ class TicketController { private $auditLogModel; private $userModel; private $workflowModel; + private $templateModel; private $envVars; public function __construct($conn) { @@ -20,6 +22,7 @@ class TicketController { $this->auditLogModel = new AuditLogModel($conn); $this->userModel = new UserModel($conn); $this->workflowModel = new WorkflowModel($conn); + $this->templateModel = new TemplateModel($conn); // Load environment variables for Discord webhook $envPath = dirname(__DIR__) . '/.env'; @@ -95,6 +98,7 @@ class TicketController { // Validate input if (empty($ticketData['title'])) { $error = "Title is required"; + $templates = $this->templateModel->getAllTemplates(); include dirname(__DIR__) . '/views/CreateTicketView.php'; return; } @@ -116,10 +120,14 @@ class TicketController { exit; } else { $error = $result['error']; + $templates = $this->templateModel->getAllTemplates(); include dirname(__DIR__) . '/views/CreateTicketView.php'; return; } } else { + // Get all templates for the template selector + $templates = $this->templateModel->getAllTemplates(); + // Display the create ticket form include dirname(__DIR__) . '/views/CreateTicketView.php'; } diff --git a/models/TemplateModel.php b/models/TemplateModel.php new file mode 100644 index 0000000..3e8fda9 --- /dev/null +++ b/models/TemplateModel.php @@ -0,0 +1,120 @@ +conn = $conn; + } + + /** + * Get all active templates + * + * @return array Array of template records + */ + public function getAllTemplates() { + $sql = "SELECT * FROM ticket_templates WHERE is_active = TRUE ORDER BY template_name"; + $result = $this->conn->query($sql); + + $templates = []; + while ($row = $result->fetch_assoc()) { + $templates[] = $row; + } + return $templates; + } + + /** + * Get template by ID + * + * @param int $templateId Template ID + * @return array|null Template record or null if not found + */ + public function getTemplateById($templateId) { + $sql = "SELECT * FROM ticket_templates WHERE template_id = ? AND is_active = TRUE"; + $stmt = $this->conn->prepare($sql); + $stmt->bind_param("i", $templateId); + $stmt->execute(); + $result = $stmt->get_result(); + + $template = $result->fetch_assoc(); + $stmt->close(); + return $template; + } + + /** + * Create a new template + * + * @param array $data Template data + * @param int $createdBy User ID creating the template + * @return bool Success status + */ + public function createTemplate($data, $createdBy) { + $sql = "INSERT INTO ticket_templates (template_name, title_template, description_template, + category, type, default_priority, created_by) + VALUES (?, ?, ?, ?, ?, ?, ?)"; + $stmt = $this->conn->prepare($sql); + $stmt->bind_param("sssssii", + $data['template_name'], + $data['title_template'], + $data['description_template'], + $data['category'], + $data['type'], + $data['default_priority'], + $createdBy + ); + + $result = $stmt->execute(); + $stmt->close(); + return $result; + } + + /** + * Update an existing template + * + * @param int $templateId Template ID + * @param array $data Template data to update + * @return bool Success status + */ + public function updateTemplate($templateId, $data) { + $sql = "UPDATE ticket_templates SET + template_name = ?, + title_template = ?, + description_template = ?, + category = ?, + type = ?, + default_priority = ? + WHERE template_id = ?"; + $stmt = $this->conn->prepare($sql); + $stmt->bind_param("ssssiii", + $data['template_name'], + $data['title_template'], + $data['description_template'], + $data['category'], + $data['type'], + $data['default_priority'], + $templateId + ); + + $result = $stmt->execute(); + $stmt->close(); + return $result; + } + + /** + * Deactivate a template (soft delete) + * + * @param int $templateId Template ID + * @return bool Success status + */ + public function deactivateTemplate($templateId) { + $sql = "UPDATE ticket_templates SET is_active = FALSE WHERE template_id = ?"; + $stmt = $this->conn->prepare($sql); + $stmt->bind_param("i", $templateId); + + $result = $stmt->execute(); + $stmt->close(); + return $result; + } +} diff --git a/views/CreateTicketView.php b/views/CreateTicketView.php index 2d9544e..0c10330 100644 --- a/views/CreateTicketView.php +++ b/views/CreateTicketView.php @@ -24,6 +24,20 @@
+
+ + +
+