From 4a18318cb9eb482a2a57c56e53db92b6798280a4 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 2 Jun 2026 18:46:12 -0500 Subject: [PATCH] feat: search KB before submitting ticket (frontend + backend) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both frontend and admin ticket creation now show a KB search step first. User types their issue, Smart Search (com_finder) returns matching articles. If nothing helps, they click through to the ticket form with the search query pre-filled as the subject. Frontend (/support/submit-ticket): - Search input with live results from #__finder_links - Article links open in new tab - "Submit Anyway" shows the ticket form - Falls back to direct form if Smart Search has no indexed content Admin (New Ticket modal): - Same KB search step before the form - Results as clickable list-group items - Modal resets on close Also: - Added searchKb controller task (both frontend + admin) - Added "Submit a Ticket" child menu item under Support on install - Fixed innerHTML → safe DOM methods for search results Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/Controller/DisplayController.php | 42 ++++ .../admin/tmpl/tickets/default.php | 117 ++++++++-- .../site/src/Controller/DisplayController.php | 167 ++++++++++++-- .../com_mokowaas/site/tmpl/tickets/submit.php | 204 ++++++++++++++++++ src/script.php | 36 ++++ 5 files changed, 528 insertions(+), 38 deletions(-) create mode 100644 src/packages/com_mokowaas/site/tmpl/tickets/submit.php diff --git a/src/packages/com_mokowaas/admin/src/Controller/DisplayController.php b/src/packages/com_mokowaas/admin/src/Controller/DisplayController.php index fe5e1a88..01ca5a98 100644 --- a/src/packages/com_mokowaas/admin/src/Controller/DisplayController.php +++ b/src/packages/com_mokowaas/admin/src/Controller/DisplayController.php @@ -226,6 +226,48 @@ class DisplayController extends BaseController )); } + // ================================================================== + // KB Search + // ================================================================== + + public function searchKb() + { + $query = Factory::getApplication()->getInput()->getString('q', ''); + + if (strlen($query) < 3) + { + $this->jsonResponse(['results' => []]); + } + + try + { + $db = Factory::getDbo(); + $escaped = $db->quote('%' . $db->escape($query, true) . '%'); + + $results = $db->setQuery( + $db->getQuery(true) + ->select([$db->quoteName('l.title'), $db->quoteName('l.url'), $db->quoteName('l.description')]) + ->from($db->quoteName('#__finder_links', 'l')) + ->where($db->quoteName('l.published') . ' = 1') + ->where('(' . $db->quoteName('l.title') . ' LIKE ' . $escaped + . ' OR ' . $db->quoteName('l.description') . ' LIKE ' . $escaped . ')') + ->order($db->quoteName('l.title') . ' ASC') + ->setLimit(8) + )->loadObjectList() ?: []; + + foreach ($results as $r) + { + $r->description = mb_substr(strip_tags($r->description ?? ''), 0, 150); + } + + $this->jsonResponse(['results' => $results]); + } + catch (\Throwable $e) + { + $this->jsonResponse(['results' => []]); + } + } + // ================================================================== // Importers // ================================================================== diff --git a/src/packages/com_mokowaas/admin/tmpl/tickets/default.php b/src/packages/com_mokowaas/admin/tmpl/tickets/default.php index 8b3a241e..5d40328b 100644 --- a/src/packages/com_mokowaas/admin/tmpl/tickets/default.php +++ b/src/packages/com_mokowaas/admin/tmpl/tickets/default.php @@ -135,11 +135,25 @@ $priorityBadge = [ diff --git a/src/script.php b/src/script.php index 5afdddef..7afd3b8c 100644 --- a/src/script.php +++ b/src/script.php @@ -771,6 +771,42 @@ class Pkg_MokowaasInstallerScript ]; $db->insertObject('#__menu', $item, 'id'); + $supportId = (int) $item->id; + + // Create "Submit a Ticket" child menu item + if ($supportId) + { + $db->setQuery('SELECT MAX(rgt) FROM #__menu WHERE client_id = 0'); + $maxRgt2 = (int) $db->loadResult(); + + $child = (object) [ + 'menutype' => 'mainmenu', + 'title' => 'Submit a Ticket', + 'alias' => 'submit-ticket', + 'note' => '', + 'path' => 'support/submit-ticket', + 'link' => 'index.php?option=com_mokowaas&view=tickets&layout=submit', + 'type' => 'component', + 'published' => 1, + 'parent_id' => $supportId, + 'level' => 2, + 'component_id' => $componentId, + 'checked_out' => null, + 'checked_out_time' => null, + 'browserNav' => 0, + 'access' => 2, + 'img' => '', + 'template_style_id' => 0, + 'params' => '{}', + 'lft' => $maxRgt2 + 1, + 'rgt' => $maxRgt2 + 2, + 'home' => 0, + 'language' => '*', + 'client_id' => 0, + ]; + + $db->insertObject('#__menu', $child, 'id'); + } } catch (\Throwable $e) {