Added function formatDuration to format times like worked etc, updated Time worked in Ticket details to use the new function and some other minor ui/ux cleanups in ticket details

This commit is contained in:
johnnyq 2026-01-28 16:08:39 -05:00
parent 704d770ec2
commit 0470159c55
2 changed files with 44 additions and 20 deletions

View File

@ -705,7 +705,7 @@ if (isset($_GET['ticket_id'])) {
$user_avatar = nullable_htmlentities($row['user_avatar']); $user_avatar = nullable_htmlentities($row['user_avatar']);
$user_initials = initials($row['user_name']); $user_initials = initials($row['user_name']);
$avatar_link = "../uploads/users/$user_id/$user_avatar"; $avatar_link = "../uploads/users/$user_id/$user_avatar";
$ticket_reply_time_worked = date_create($row['ticket_reply_time_worked']); $ticket_reply_time_worked = $row['ticket_reply_time_worked'];
} }
$sql_ticket_reply_attachments = mysqli_query( $sql_ticket_reply_attachments = mysqli_query(
@ -737,7 +737,14 @@ if (isset($_GET['ticket_id'])) {
<div> <div>
<?php if ($ticket_reply_type !== "Client") { ?> <?php if ($ticket_reply_type !== "Client") { ?>
<div> <div>
<br><small class="text-muted">Time worked: <?php echo date_format($ticket_reply_time_worked, 'H:i:s'); ?></small> <br>
<small>
<i class="far fa-fw fa-clock text-secondary"></i>
Time worked:
<span class="text-muted">
<?= formatDuration($ticket_reply_time_worked) ?>
</span>
</small>
</div> </div>
<?php } ?> <?php } ?>
</div> </div>
@ -810,7 +817,7 @@ if (isset($_GET['ticket_id'])) {
<div class="col-md-3"> <div class="col-md-3">
<!-- Ticket details right card --> <!-- Ticket details right card -->
<div class="card <?php if(!$ticket_resolved_at) { echo "collapsed-card"; } ?>"> <div class="card">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fas fa-fw fa-life-ring mr-2"></i>Ticket Details</h5> <h5 class="card-title"><i class="fas fa-fw fa-life-ring mr-2"></i>Ticket Details</h5>
@ -824,45 +831,45 @@ if (isset($_GET['ticket_id'])) {
<!-- Created --> <!-- Created -->
<div title="<?php echo $ticket_created_at; ?>"> <div title="<?php echo $ticket_created_at; ?>">
<i class="fa fa-fw fa-calendar text-secondary mr-2"></i><strong>Created: </strong><?php echo "$ticket_date ($ticket_created_at_ago)"; ?> <i class="fas fa-fw fa-calendar text-secondary mr-2"></i><strong class="mr-2">Created:</strong><?= date('M d, Y', strtotime($ticket_date)) . " ($ticket_created_at_ago)" ?>
</div> </div>
<!-- Created by --> <!-- Created by -->
<?php if (!empty($ticket_created_by)) { <?php if ($ticket_created_by) {
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT user_name FROM users WHERE user_id = $ticket_created_by")); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT user_name FROM users WHERE user_id = $ticket_created_by"));
$ticket_created_by_display = nullable_htmlentities($row['user_name']); $ticket_created_by_display = nullable_htmlentities($row['user_name']);
?> ?>
<div class="mt-1"> <div class="mt-1">
<i class="far fa-fw fa-user text-secondary mr-2"></i><strong>Created by: </strong><?php echo $ticket_created_by_display; ?> <i class="far fa-fw fa-user text-secondary mr-2"></i><strong class="mr-2">Created by:</strong><?= $ticket_created_by_display ?>
</div> </div>
<?php } ?> <?php } ?>
<!-- Source --> <!-- Source -->
<?php if (!empty($ticket_source)) { ?> <?php if ($ticket_source) { ?>
<div class="mt-1"> <div class="mt-1">
<i class="far fa-fw fa-question-circle text-secondary mr-2"></i><strong>Source: </strong><?php echo $ticket_source; ?> <i class="far fa-fw fa-question-circle text-secondary mr-2"></i><strong class="mr-2">Source:</strong><?= $ticket_source ?>
</div> </div>
<?php } ?> <?php } ?>
<!-- Category --> <!-- Category -->
<?php if ($ticket_category > 0) { ?> <?php if ($ticket_category) { ?>
<div class="mt-1"> <div class="mt-1">
<i class="fas fa-fw fa-layer-group mr-2 text-secondary"></i><strong>Category: </strong><?php echo $ticket_category_display; ?> <i class="fas fa-fw fa-layer-group mr-2 text-secondary"></i><strong class="mr-2">Category:</strong><?= $ticket_category_display ?>
</div> </div>
<?php } ?> <?php } ?>
<!-- First response (for SLA) --> <!-- First response (for SLA) -->
<?php if ($ticket_first_response_at) { ?> <?php if ($ticket_first_response_at) { ?>
<div title="First Response: <?php echo $ticket_created_at; ?>"> <div class="mt-1">
<i class="fa fa-fw fa-user-clock text-secondary mr-2"></i><strong>FR: </strong><?php echo "$ticket_first_response_at"; ?> <i class="fas fa-fw fa-user-clock text-secondary mr-2"></i><strong class="mr-2">First Response:</strong><?= date('M d, Y • h:m A', strtotime($ticket_first_response_at)) ?>
</div> </div>
<?php } ?> <?php } ?>
<!-- Time tracking --> <!-- Time tracking -->
<?php if ($ticket_total_reply_time) { ?> <?php if ($ticket_total_reply_time) { ?>
<div class="mt-1"> <div class="mt-1">
<i class="far fa-fw fa-clock text-secondary mr-2"></i><strong>Time worked: </strong><?php echo $ticket_total_reply_time; ?> <i class="far fa-fw fa-clock text-secondary mr-2"></i><strong class="mr-2">Time worked:</strong><?= formatDuration($ticket_total_reply_time) ?>
</div> </div>
<?php } ?> <?php } ?>
@ -875,15 +882,15 @@ if (isset($_GET['ticket_id'])) {
<!-- --><?php //} ?> <!-- --><?php //} ?>
<!-- Resolved --> <!-- Resolved -->
<?php if (!empty($ticket_resolved_at)) { ?> <?php if ($ticket_resolved_at) { ?>
<hr> <hr>
<div class="mt-1" title="<?php echo $ticket_resolved_at; ?>"> <div class="mt-1" title="<?= $ticket_resolved_at ?>">
<i class="fa fa-fw fa-check text-secondary mr-2"></i><strong>Resolved: </strong><?php echo "$ticket_resolved_date ($ticket_resolved_at_ago)"; ?> <i class="fas fa-fw fa-check text-secondary mr-2"></i><strong class="mr-2">Resolved:</strong><?= date('M d, Y • h:m A', strtotime($ticket_resolved_at)) . " ($ticket_resolved_at_ago)" ?>
</div> </div>
<?php } ?> <?php } ?>
<!-- Ticket closure info --> <!-- Ticket closure info -->
<?php if (!empty($ticket_closed_at)) { <?php if ($ticket_closed_at) {
$ticket_closed_by_display = 'User'; $ticket_closed_by_display = 'User';
if (!empty($ticket_closed_by)) { if (!empty($ticket_closed_by)) {
@ -893,11 +900,11 @@ if (isset($_GET['ticket_id'])) {
} }
?> ?>
<div class="mt-1"> <div class="mt-1">
<i class="fa fa-fw fa-user text-secondary mr-2"></i><strong>Closed by: </strong><?php echo ucwords($ticket_closed_by_display); ?> <i class="fas fa-fw fa-user text-secondary mr-2"></i><strong class="mr-2">Closed by:</strong><?= ucwords($ticket_closed_by_display) ?>
</div> </div>
<div class="mt-1" title="<?php echo $ticket_closed_at; ?>"> <div class="mt-1">
<i class="fa fa-fw fa-clock text-secondary mr-2"></i><strong>Closed: </strong><?php echo "$ticket_closed_date ($ticket_closed_at_ago)"; ?> <i class="fas fa-fw fa-clock text-secondary mr-2"></i><strong class="mr-2">Closed:</strong><?= date('M d, Y • h:m A', strtotime($ticket_closed_at)) . " ($ticket_closed_at_ago)" ?>
</div> </div>
<?php if ($ticket_feedback) { ?> <?php if ($ticket_feedback) { ?>

View File

@ -1998,3 +1998,20 @@ function dbRollback(mysqli $mysqli): void
{ {
$mysqli->rollback(); $mysqli->rollback();
} }
function formatDuration($time) {
// expects "HH:MM:SS"
[$h, $m, $s] = array_map('intval', explode(':', $time));
$parts = [];
if ($h > 0) $parts[] = $h . 'h';
if ($m > 0) $parts[] = $m . 'm';
// show seconds only if under 1 minute total OR if nothing else exists
if ($h == 0 && $m == 0) {
$parts[] = $s . 's';
}
return implode(' ', $parts);
}