mirror of
https://github.com/getnamingo/registry.git
synced 2025-07-01 08:33:22 +02:00
Support system UI improvements
This commit is contained in:
parent
16657033ca
commit
b6e2f5ea5b
2 changed files with 146 additions and 58 deletions
|
@ -118,29 +118,30 @@ class SupportController extends Controller
|
||||||
if ($ticket_owner != $clid && $_SESSION["auth_roles"] != 0) {
|
if ($ticket_owner != $clid && $_SESSION["auth_roles"] != 0) {
|
||||||
return $response->withHeader('Location', '/support')->withStatus(302);
|
return $response->withHeader('Location', '/support')->withStatus(302);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current URI
|
// Get the current URI
|
||||||
$uri = $request->getUri()->getPath();
|
$uri = $request->getUri()->getPath();
|
||||||
|
|
||||||
$ticket = $db->selectRow('SELECT st.*, u.username AS ticket_creator
|
$ticket = $db->selectRow('SELECT st.*, u.username AS ticket_creator, st.user_id
|
||||||
FROM support_tickets AS st
|
FROM support_tickets AS st
|
||||||
JOIN users AS u ON st.user_id = u.id
|
JOIN users AS u ON st.user_id = u.id
|
||||||
WHERE st.id = ?', [$ticketNumber]);
|
WHERE st.id = ?', [$ticketNumber]);
|
||||||
|
|
||||||
if ($ticket) {
|
if ($ticket) {
|
||||||
$replies = $db->select('SELECT tr.*, u.username AS responder_name
|
$replies = $db->select('SELECT tr.*, u.username AS responder_name, tr.responder_id
|
||||||
FROM ticket_responses AS tr
|
FROM ticket_responses AS tr
|
||||||
JOIN users AS u ON tr.responder_id = u.id
|
JOIN users AS u ON tr.responder_id = u.id
|
||||||
WHERE tr.ticket_id = ?
|
WHERE tr.ticket_id = ?
|
||||||
ORDER BY tr.date_created DESC', [$ticketNumber]);
|
ORDER BY tr.date_created ASC', [$ticketNumber]);
|
||||||
$category = $db->selectValue('SELECT name FROM ticket_categories WHERE id = ?', [$ticket['category_id']]);
|
$category = $db->selectValue('SELECT name FROM ticket_categories WHERE id = ?', [$ticket['category_id']]);
|
||||||
|
|
||||||
$_SESSION['current_ticket'] = [$ticket['id']];
|
$_SESSION['current_ticket'] = [$ticket['id']];
|
||||||
return view($response,'admin/support/viewTicket.twig', [
|
return view($response,'admin/support/viewTicket.twig', [
|
||||||
'ticket' => $ticket,
|
'ticket' => $ticket,
|
||||||
'replies' => $replies,
|
'replies' => $replies,
|
||||||
'category' => $category,
|
'category' => $category,
|
||||||
'currentUri' => $uri
|
'currentUri' => $uri,
|
||||||
|
'user_id' => $_SESSION['auth_user_id']
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
$this->container->get('flash')->addMessage('error', 'Invalid ticket number');
|
$this->container->get('flash')->addMessage('error', 'Invalid ticket number');
|
||||||
|
|
|
@ -29,18 +29,7 @@
|
||||||
{{ csrf.field | raw }}
|
{{ csrf.field | raw }}
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">{{ __('Ticket') }} #{{ ticket.id }} - {{ ticket.subject }}</h3>
|
<h3 class="card-title">{{ __('Ticket') }} #{{ ticket.id }} - {{ ticket.subject }}</h3>
|
||||||
{% if ticket.status == 'Open' %}
|
|
||||||
<span class="status status-success">{{ ticket.status }}</span>
|
|
||||||
{% elseif ticket.status == 'In Progress' %}
|
|
||||||
<span class="status status-warning">{{ ticket.status }}</span>
|
|
||||||
{% elseif ticket.status == 'Resolved' %}
|
|
||||||
<span class="status status-info">{{ ticket.status }}</span>
|
|
||||||
{% elseif ticket.status == 'Closed' %}
|
|
||||||
<span class="status status-cyan">{{ ticket.status }}</span>
|
|
||||||
{% else %}
|
|
||||||
<span class="status status-teal">{{ __('Unknown Status') }}</span>
|
|
||||||
{% endif %}
|
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
{% if ticket.status != 'Closed' %}
|
{% if ticket.status != 'Closed' %}
|
||||||
<button type="submit" name="action" value="close" class="btn btn-ghost-warning">
|
<button type="submit" name="action" value="close" class="btn btn-ghost-warning">
|
||||||
|
@ -63,48 +52,143 @@
|
||||||
{% if ticket.status != 'Closed' %}<form action="/support/reply" method="post">
|
{% if ticket.status != 'Closed' %}<form action="/support/reply" method="post">
|
||||||
{{ csrf.field | raw }}
|
{{ csrf.field | raw }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="row g-0">
|
||||||
|
<div class="col-12 col-lg-5 col-xl-3 border-end">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h6 class="card-subtitle mb-2 text-muted">{{ __('Ticket Details') }}</h6>
|
<div class="datagrid">
|
||||||
<p><span>{{ __('Created On') }}:</span> <strong>{{ ticket.date_created }}</strong></p>
|
<div class="datagrid-item">
|
||||||
<p><span>{{ __('Category') }}:</span> <span class="status status-indigo">{{ category }}</span></p>
|
<div class="datagrid-title">{{ __('Created On') }}</div>
|
||||||
<p><span>{{ __('Priority') }}:</span>
|
<div class="datagrid-content"><strong>{{ ticket.date_created }}</strong></div>
|
||||||
{% if ticket.priority == 'Low' %}
|
</div>
|
||||||
<span class="status status-teal">{{ __('Low') }}</span>
|
<div class="datagrid-item">
|
||||||
{% elseif ticket.priority == 'Medium' %}
|
<div class="datagrid-title">{{ __('Category') }}</div>
|
||||||
<span class="status status-blue">{{ __('Medium') }}</span>
|
<div class="datagrid-content"><span class="status status-indigo">{{ category }}</span></div>
|
||||||
{% elseif ticket.priority == 'High' %}
|
</div>
|
||||||
<span class="status status-orange">{{ __('High') }}</span>
|
<div class="datagrid-item">
|
||||||
{% elseif ticket.priority == 'Critical' %}
|
<div class="datagrid-title">{{ __('Status') }}</div>
|
||||||
<span class="status status-red">{{ __('Critical') }}</span>
|
<div class="datagrid-content">
|
||||||
{% else %}
|
{% if ticket.status == 'Open' %}
|
||||||
<span class="status status-cyan">{{ __('Unknown') }}</span>
|
<span class="status status-success">{{ ticket.status }}</span>
|
||||||
{% endif %}</p>
|
{% elseif ticket.status == 'In Progress' %}
|
||||||
|
<span class="status status-warning">{{ ticket.status }}</span>
|
||||||
<div class="card mt-4">
|
{% elseif ticket.status == 'Resolved' %}
|
||||||
<div class="card-body">
|
<span class="status status-info">{{ ticket.status }}</span>
|
||||||
<h6 class="card-subtitle text-muted">{{ __('Conversation') }}</h6>
|
{% elseif ticket.status == 'Closed' %}
|
||||||
{% for reply in replies %}
|
<span class="status status-cyan">{{ ticket.status }}</span>
|
||||||
<div class="d-flex align-items-start mb-3">
|
{% else %}
|
||||||
<div class="flex-shrink-0">
|
<span class="status status-teal">{{ __('Unknown Status') }}</span>
|
||||||
<span class="avatar">{{ reply.responder_name|slice(0, 2) }}</span>
|
{% endif %}
|
||||||
</div>
|
|
||||||
<div class="flex-grow-1 ms-3">
|
|
||||||
<strong>{{ reply.responder_name }}</strong>
|
|
||||||
<small class="text-muted">{{ reply.date_created|date("Y-m-d H:i") }}</small>
|
|
||||||
<p>{{ reply.response }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
<div class="d-flex align-items-start">
|
|
||||||
<div class="flex-shrink-0">
|
|
||||||
<span class="avatar">{{ ticket.ticket_creator|slice(0, 2) }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex-grow-1 ms-3">
|
|
||||||
<strong>{{ ticket.ticket_creator }}</strong> <small class="text-muted">{{ ticket.date_created|date("Y-m-d H:i") }}</small>
|
|
||||||
<p>{{ ticket.message }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="datagrid-item">
|
||||||
|
<div class="datagrid-title">{{ __('Priority') }}</div>
|
||||||
|
<div class="datagrid-content">
|
||||||
|
{% if ticket.priority == 'Low' %}
|
||||||
|
<span class="status status-teal">{{ __('Low') }}</span>
|
||||||
|
{% elseif ticket.priority == 'Medium' %}
|
||||||
|
<span class="status status-blue">{{ __('Medium') }}</span>
|
||||||
|
{% elseif ticket.priority == 'High' %}
|
||||||
|
<span class="status status-orange">{{ __('High') }}</span>
|
||||||
|
{% elseif ticket.priority == 'Critical' %}
|
||||||
|
<span class="status status-red">{{ __('Critical') }}</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="status status-cyan">{{ __('Unknown') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 col-lg-7 col-xl-9 d-flex flex-column">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="card mt-4">
|
||||||
|
<div class="card-body scrollable" style="height: 35rem">
|
||||||
|
<div class="chat">
|
||||||
|
<div class="chat-bubbles">
|
||||||
|
{% if ticket.user_id != user_id %}
|
||||||
|
<div class="chat-item">
|
||||||
|
<div class="row align-items-end">
|
||||||
|
<div class="col-auto"><span class="avatar">{{ ticket.ticket_creator|slice(0, 2) }}</span></div>
|
||||||
|
<div class="col col-lg-6">
|
||||||
|
<div class="chat-bubble">
|
||||||
|
<div class="chat-bubble-title">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col chat-bubble-author">{{ ticket.ticket_creator }}</div>
|
||||||
|
<div class="col-auto chat-bubble-date">{{ ticket.date_created|date("Y-m-d H:i") }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-bubble-body">
|
||||||
|
<p>{{ ticket.message }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="chat-item">
|
||||||
|
<div class="row align-items-end justify-content-end">
|
||||||
|
<div class="col col-lg-6">
|
||||||
|
<div class="chat-bubble chat-bubble-me">
|
||||||
|
<div class="chat-bubble-title">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col chat-bubble-author">{{ ticket.ticket_creator }}</div>
|
||||||
|
<div class="col-auto chat-bubble-date">{{ ticket.date_created|date("Y-m-d H:i") }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-bubble-body">
|
||||||
|
<p>{{ ticket.message }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto"><span class="avatar">{{ ticket.ticket_creator|slice(0, 2) }}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% for reply in replies %}
|
||||||
|
{% if reply.responder_id == user_id %}
|
||||||
|
<div class="chat-item">
|
||||||
|
<div class="row align-items-end justify-content-end">
|
||||||
|
<div class="col col-lg-6">
|
||||||
|
<div class="chat-bubble chat-bubble-me">
|
||||||
|
<div class="chat-bubble-title">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col chat-bubble-author">{{ reply.responder_name }}</div>
|
||||||
|
<div class="col-auto chat-bubble-date">{{ reply.date_created|date("Y-m-d H:i") }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-bubble-body">
|
||||||
|
<p>{{ reply.response }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto"><span class="avatar">{{ reply.responder_name|slice(0, 2) }}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="chat-item">
|
||||||
|
<div class="row align-items-end">
|
||||||
|
<div class="col-auto"><span class="avatar">{{ reply.responder_name|slice(0, 2) }}</span></div>
|
||||||
|
<div class="col col-lg-6">
|
||||||
|
<div class="chat-bubble">
|
||||||
|
<div class="chat-bubble-title">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col chat-bubble-author">{{ reply.responder_name }}</div>
|
||||||
|
<div class="col-auto chat-bubble-date">{{ reply.date_created|date("Y-m-d H:i") }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-bubble-body">
|
||||||
|
<p>{{ reply.response }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if ticket.status != 'Closed' %}
|
{% if ticket.status != 'Closed' %}
|
||||||
|
@ -114,6 +198,9 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% if ticket.status != 'Closed' %}
|
{% if ticket.status != 'Closed' %}
|
||||||
<div class="card-footer">
|
<div class="card-footer">
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue