4b9a675d0f
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Project CI / Lint & Validate (push) Successful in 36s
Platform: moko-platform CI / Gate 1: Code Quality (push) Failing after 40s
Generic: Project CI / Tests (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
All Joomla element names, PHP classes, language files, folder structure, and manifest references renamed from mokosuite to mokosuiteclient. This repo is now the client-facing tracker for the MokoSuite platform.
85 lines
2.7 KiB
PHP
85 lines
2.7 KiB
PHP
<?php
|
|
/**
|
|
* @package MokoSuiteClient
|
|
* @subpackage com_mokosuiteclient.site
|
|
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
|
|
* @license GNU General Public License version 3 or later; see LICENSE
|
|
*/
|
|
|
|
namespace Moko\Component\MokoSuiteClient\Site\View\Ticket;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
|
use Joomla\CMS\Router\Route;
|
|
|
|
class HtmlView extends BaseHtmlView
|
|
{
|
|
protected $ticket;
|
|
protected $isStaff = false;
|
|
protected $canAssign = false;
|
|
|
|
public function display($tpl = null)
|
|
{
|
|
$db = Factory::getContainer()->get('Joomla\Database\DatabaseInterface');
|
|
$user = Factory::getApplication()->getIdentity();
|
|
$id = Factory::getApplication()->getInput()->getInt('id', 0);
|
|
|
|
$this->isStaff = $user->authorise('core.admin') || $user->authorise('mokosuiteclient.tickets', 'com_mokosuiteclient');
|
|
$this->canAssign = $user->authorise('core.admin') || $user->authorise('mokosuiteclient.tickets.assign', 'com_mokosuiteclient');
|
|
|
|
// Get ticket — staff see any, customers see only their own
|
|
$query = $db->getQuery(true)
|
|
->select([
|
|
$db->quoteName('t') . '.*',
|
|
$db->quoteName('c.title', 'category_title'),
|
|
$db->quoteName('u.name', 'created_by_name'),
|
|
$db->quoteName('u.email', 'created_by_email'),
|
|
$db->quoteName('a.name', 'assigned_to_name'),
|
|
])
|
|
->from($db->quoteName('#__mokosuiteclient_tickets', 't'))
|
|
->leftJoin($db->quoteName('#__mokosuiteclient_ticket_categories', 'c') . ' ON c.id = t.category_id')
|
|
->leftJoin($db->quoteName('#__users', 'u') . ' ON u.id = t.created_by')
|
|
->leftJoin($db->quoteName('#__users', 'a') . ' ON a.id = t.assigned_to')
|
|
->where($db->quoteName('t.id') . ' = ' . $id);
|
|
|
|
if (!$this->isStaff)
|
|
{
|
|
$query->where($db->quoteName('t.created_by') . ' = ' . (int) $user->id);
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
$this->ticket = $db->loadObject();
|
|
|
|
if (!$this->ticket)
|
|
{
|
|
Factory::getApplication()->enqueueMessage('Ticket not found.', 'error');
|
|
Factory::getApplication()->redirect(Route::_('index.php?option=com_mokosuiteclient&view=tickets', false));
|
|
|
|
return;
|
|
}
|
|
|
|
// Load replies — staff see internal notes, customers don't
|
|
$query = $db->getQuery(true)
|
|
->select([
|
|
$db->quoteName('r') . '.*',
|
|
$db->quoteName('u.name', 'user_name'),
|
|
])
|
|
->from($db->quoteName('#__mokosuiteclient_ticket_replies', 'r'))
|
|
->leftJoin($db->quoteName('#__users', 'u') . ' ON u.id = r.user_id')
|
|
->where($db->quoteName('r.ticket_id') . ' = ' . $id);
|
|
|
|
if (!$this->isStaff)
|
|
{
|
|
$query->where($db->quoteName('r.is_internal') . ' = 0');
|
|
}
|
|
|
|
$query->order($db->quoteName('r.created') . ' ASC');
|
|
$db->setQuery($query);
|
|
$this->ticket->replies = $db->loadObjectList() ?: [];
|
|
|
|
parent::display($tpl);
|
|
}
|
|
}
|