Initial migration from AdminLTE 3 to 4, bootstrap 4 to 5

This commit is contained in:
johnnyq
2026-08-14 13:22:11 -04:00
parent 691059aab2
commit a084e37c39
458 changed files with 6069 additions and 8634 deletions

View File

@@ -132,7 +132,7 @@ if (isset($_GET['ticket_id'])) {
$ticket_assigned_to = intval($ticket['ticket_assigned_to']);
if (empty($ticket_assigned_to)) {
$ticket_assigned_to_display = "<span class='text-danger'><i class='fas fa-fw fa-user-slash mr-1'></i>Unassigned</span>";
$ticket_assigned_to_display = "<span class='text-danger'><i class='fas fa-fw fa-user-slash me-1'></i>Unassigned</span>";
} else {
$ticket_assigned_to_display = escapeHtml($ticket['user_name']);
}
@@ -385,23 +385,23 @@ if (isset($_GET['ticket_id'])) {
if ($sla_breached) {
$sla_state = 'breached';
$sla_label = 'SLA breached';
$sla_class = 'badge-danger';
$sla_class = 'bg-danger';
$sla_icon = 'fa-exclamation-triangle';
} elseif (!$ticket_is_open) {
$sla_state = 'met';
$sla_label = 'SLA met';
$sla_class = 'badge-success';
$sla_class = 'bg-success';
$sla_icon = 'fa-check';
} elseif ($ticket_sla_paused) {
$sla_state = 'paused';
$sla_label = 'SLA paused';
$sla_class = 'badge-secondary';
$sla_class = 'bg-secondary';
$sla_icon = 'fa-pause';
} elseif (!empty($sla_next_due)) {
$sla_overdue = strtotime($sla_next_due) < time();
$sla_state = $sla_overdue ? 'breached' : 'running';
$sla_label = $sla_next_label . ' ' . timeAgo($sla_next_due);
$sla_class = $sla_overdue ? 'badge-danger' : 'badge-light border';
$sla_class = $sla_overdue ? 'bg-danger' : 'bg-light border';
}
}
@@ -421,7 +421,7 @@ if (isset($_GET['ticket_id'])) {
<div class="d-flex flex-wrap justify-content-between">
<div class="mr-3" style="min-width: 0;">
<div class="me-3" style="min-width: 0;">
<!--
The breadcrumb band above the card is gone, so these lines
@@ -439,7 +439,7 @@ if (isset($_GET['ticket_id'])) {
<!-- Who it belongs to, where it came from, and anyone else in here right now -->
<div class="ticket-meta">
<span class="badge badge-pill badge-dark mr-2"><?= $ticket_reference ?></span>
<span class="badge rounded-pill bg-dark me-2"><?= $ticket_reference ?></span>
<?php if ($client_id) { ?>
<a href="client_overview.php?client_id=<?= $client_id ?>"><?= $client_name ?></a>
@@ -472,20 +472,20 @@ if (isset($_GET['ticket_id'])) {
$show_invoice_button = $config_module_enable_accounting && $ticket_billable == 1 && empty($invoice_id) && lookupUserPermission("module_sales") >= 2;
$has_action_buttons = $show_quote_button || $show_invoice_button || !$ticket_is_closed;
?>
<div class="d-print-none text-right">
<div class="d-print-none text-end">
<div class="d-flex flex-wrap justify-content-end align-items-start">
<?php if ($has_action_buttons) { ?>
<div class="btn-group mr-3 mb-1">
<div class="btn-group me-3 mb-1">
<?php if ($show_quote_button) { ?>
<a href="#" class="btn btn-light ajax-modal" data-modal-url="modals/ticket/ticket_quote_add.php?ticket_id=<?= $ticket_id ?>" data-modal-size="lg">
<i class="fas fa-fw fa-comment-dollar mr-2"></i>Quote
<i class="fas fa-fw fa-comment-dollar me-2"></i>Quote
</a>
<?php } ?>
<?php if ($show_invoice_button) { ?>
<a href="#" class="btn btn-light ajax-modal" data-modal-url="modals/ticket/ticket_invoice_add.php?ticket_id=<?= $ticket_id ?>" data-modal-size="lg">
<i class="fas fa-fw fa-file-invoice mr-2"></i>Invoice
<i class="fas fa-fw fa-file-invoice me-2"></i>Invoice
</a>
<?php } ?>
@@ -493,7 +493,7 @@ if (isset($_GET['ticket_id'])) {
<?php if ($ticket_is_resolved) { ?>
<a href="post.php?reopen_ticket=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>" class="btn btn-light">
<i class="fas fa-fw fa-redo mr-2"></i>Reopen
<i class="fas fa-fw fa-redo me-2"></i>Reopen
</a>
<?php } ?>
@@ -506,11 +506,11 @@ if (isset($_GET['ticket_id'])) {
onclick="return false;"
<?php } ?>
>
<i class="fas fa-fw fa-check mr-2"></i>Resolve
<i class="fas fa-fw fa-check me-2"></i>Resolve
</a>
<?php } else { ?>
<a href="post.php?close_ticket=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>" class="btn btn-dark confirm-link" id="ticket_close">
<i class="fas fa-fw fa-gavel mr-2"></i>Close
<i class="fas fa-fw fa-gavel me-2"></i>Close
</a>
<?php } ?>
@@ -519,26 +519,26 @@ if (isset($_GET['ticket_id'])) {
</div>
<?php } ?>
<div class="dropdown dropleft mb-1">
<button class="btn btn-secondary" type="button" data-toggle="dropdown" title="More actions">
<div class="dropdown dropstart mb-1">
<button class="btn btn-secondary" type="button" data-bs-toggle="dropdown" title="More actions">
<i class="fas fa-ellipsis-v"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_summary.php?ticket_id=<?= $ticket_id ?>" data-modal-size="lg">
<i class="fas fa-fw fa-lightbulb mr-2"></i>Summarize
<i class="fas fa-fw fa-lightbulb me-2"></i>Summarize
</a>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_merge.php?ticket_id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-clone mr-2"></i>Merge Ticket
<i class="fas fa-fw fa-clone me-2"></i>Merge Ticket
</a>
<!-- Attaching things to the ticket lives on the Linked card, next to what it attaches -->
<div class="dropdown-divider"></div>
<a class="dropdown-item ajax-modal" href="#" id="clientChangeTicketModalLoad" data-modal-url="modals/ticket/ticket_change_client.php?ticket_id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-people-carry mr-2"></i>Change Client
<i class="fas fa-fw fa-people-carry me-2"></i>Change Client
</a>
<?php if (lookupUserPermission("module_support") == 3) { ?>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_ticket=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
<i class="fas fa-fw fa-trash me-2"></i>Delete
</a>
<?php } ?>
</div>
@@ -560,7 +560,7 @@ if (isset($_GET['ticket_id'])) {
<div class="ticket-field">
<div class="ticket-field-label">Status</div>
<div class="ticket-field-value">
<span class="badge badge-pill p-2 text-light" style="background-color: <?= $ticket_status_color ?>"><?= $ticket_status_name ?></span>
<span class="badge rounded-pill p-2 text-light" style="background-color: <?= $ticket_status_color ?>"><?= $ticket_status_name ?></span>
</div>
</div>
@@ -573,7 +573,7 @@ if (isset($_GET['ticket_id'])) {
data-modal-url="modals/ticket/ticket_priority.php?id=<?= $ticket_id ?>"
<?php } ?>
>
<span class="badge badge-pill badge-<?= $ticket_priority_color ?> p-2"><?= $ticket_priority ?></span>
<span class="badge rounded-pill badge-<?= $ticket_priority_color ?> p-2"><?= $ticket_priority ?></span>
</a>
</div>
</div>
@@ -589,7 +589,7 @@ if (isset($_GET['ticket_id'])) {
<?php } ?>
>
<?php if ($sla_label) { ?>
<span class="badge badge-pill <?= $sla_class ?> p-2"><i class="fas fa-fw <?= $sla_icon ?> mr-1"></i><?= $sla_label ?></span>
<span class="badge rounded-pill <?= $sla_class ?> p-2"><i class="fas fa-fw <?= $sla_icon ?> me-1"></i><?= $sla_label ?></span>
<?php } elseif ($ticket_sla_id) { ?>
<?= $ticket_sla_name ?>
<?php } else { ?>
@@ -629,9 +629,9 @@ if (isset($_GET['ticket_id'])) {
<div class="ticket-field-label">Billing</div>
<div class="ticket-field-value">
<?php if ($invoice_id) { ?>
<a href="invoice.php?invoice_id=<?= $invoice_id ?>"><i class="fa fa-fw fa-file-invoice text-secondary mr-1"></i><?= $invoice_reference ?></a>
<a href="invoice.php?invoice_id=<?= $invoice_id ?>"><i class="fa fa-fw fa-file-invoice text-secondary me-1"></i><?= $invoice_reference ?></a>
<?php } elseif ($quote_id) { ?>
<a href="quote.php?quote_id=<?= $quote_id ?>"><i class="fa fa-fw fa-comment-dollar text-secondary mr-1"></i><?= $quote_reference ?></a>
<a href="quote.php?quote_id=<?= $quote_id ?>"><i class="fa fa-fw fa-comment-dollar text-secondary me-1"></i><?= $quote_reference ?></a>
<?php } elseif ($can_edit_ticket) { ?>
<a class="ajax-modal" href="#" data-modal-url="modals/ticket/ticket_billable.php?id=<?= $ticket_id ?>" title="Change billable">
<?= $ticket_billable ? "<span class='text-bold text-dark'>Billable</span>" : "<span class='text-muted'>Not billable</span>" ?>
@@ -654,7 +654,7 @@ if (isset($_GET['ticket_id'])) {
<div class="ticket-field">
<div class="ticket-field-label">Tasks</div>
<div class="ticket-field-value d-flex align-items-center">
<div class="progress ticket-task-progress mr-2" role="progressbar" aria-valuenow="<?= $tasks_completed_percent ?>" aria-valuemin="0" aria-valuemax="100" title="<?= $tasks_completed_percent ?>% complete">
<div class="progress ticket-task-progress me-2" role="progressbar" aria-valuenow="<?= $tasks_completed_percent ?>" aria-valuemin="0" aria-valuemax="100" title="<?= $tasks_completed_percent ?>% complete">
<div class="progress-bar <?= $tasks_block_resolve ? 'bg-secondary' : 'bg-success' ?>" style="width: <?= $tasks_completed_percent ?>%;"></div>
</div>
<?= "$completed_task_count of $task_count" ?>
@@ -674,9 +674,9 @@ if (isset($_GET['ticket_id'])) {
<!-- The original request -->
<div class="card card-dark mb-3">
<div class="card-header px-3 py-2">
<h5 class="card-title mt-1"><i class="fas fa-fw fa-align-left mr-2"></i>Description</h5>
<h5 class="card-title mt-1"><i class="fas fa-fw fa-align-left me-2"></i>Description</h5>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<button type="button" class="btn btn-tool" data-lte-toggle="card-collapse">
<i class="fas fa-chevron-down"></i>
</button>
</div>
@@ -692,11 +692,11 @@ if (isset($_GET['ticket_id'])) {
$ticket_attachment_name = escapeHtml($ticket_attachment['ticket_attachment_name']);
?>
<div class="mt-1">
<i class="fas fa-fw fa-paperclip text-secondary mr-1"></i><?= $ticket_attachment_name ?>
<a target="_blank" class="ml-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>&action=view">View</a>
<a class="ml-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>">Download</a>
<i class="fas fa-fw fa-paperclip text-secondary me-1"></i><?= $ticket_attachment_name ?>
<a target="_blank" class="ms-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>&action=view">View</a>
<a class="ms-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>">Download</a>
<?php if (lookupUserPermission("module_support") >= 3) { ?>
<a class="confirm-link ml-2 small text-danger" href="post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">Delete</a>
<a class="confirm-link ms-2 small text-danger" href="post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">Delete</a>
<?php } ?>
</div>
<?php } ?>
@@ -716,34 +716,34 @@ if (isset($_GET['ticket_id'])) {
<div class="card-body p-3 d-print-none">
<!-- Who will see this reply, stated in the label rather than left to a colour -->
<div class="btn-group btn-block btn-group-toggle mb-3" data-toggle="buttons">
<div class="btn-group w-100 btn-group-toggle mb-3" data-toggle="buttons">
<label class="btn btn-outline-dark active">
<input type="radio" name="public_reply_type" value="0" checked>
<i class="fas fa-fw fa-lock mr-1"></i>Internal note
<i class="fas fa-fw fa-lock me-1"></i>Internal note
</label>
<label class="btn btn-outline-info">
<input type="radio" name="public_reply_type" value="1">
<i class="fas fa-fw fa-comment mr-1"></i>Public reply
<i class="fas fa-fw fa-comment me-1"></i>Public reply
</label>
<?php if ($contact_email) { ?>
<label class="btn btn-outline-info">
<input type="radio" name="public_reply_type" value="2">
<i class="fas fa-fw fa-paper-plane mr-1"></i>Public + email
<i class="fas fa-fw fa-paper-plane me-1"></i>Public + email
</label>
<?php } ?>
</div>
<div class="form-group">
<div class="mb-3">
<textarea class="form-control tinymceTicket" name="ticket_reply" placeholder="Type a response"></textarea>
</div>
<div class="form-group">
<input type="file" class="form-control-file" name="attachments[]" multiple accept=".jpg, .jpeg, .gif, .png, .webp, .pdf, .txt, .md, .doc, .docx, .odt, .csv, .xls, .xlsx, .ods, .pptx, .odp, .zip, .tar, .gz, .xml, .msg, .json, .wav, .mp3, .ogg, .mov, .mp4, .av1, .ovpn">
<div class="mb-3">
<input type="file" class="form-control" name="attachments[]" multiple accept=".jpg, .jpeg, .gif, .png, .webp, .pdf, .txt, .md, .doc, .docx, .odt, .csv, .xls, .xlsx, .ods, .pptx, .odp, .zip, .tar, .gz, .xml, .msg, .json, .wav, .mp3, .ogg, .mov, .mp4, .av1, .ovpn">
</div>
<div class="form-row align-items-center">
<div class="row g-2 align-items-center">
<div class="col-md-4">
<div class="form-group mb-md-0">
<div class="mb-3 mb-md-0">
<label class="text-secondary small mb-1">Set status to</label>
<select class="form-control select2" name="status" required>
<!-- Show all active ticket statuses, apart from new or closed as these are system-managed -->
@@ -765,23 +765,21 @@ if (isset($_GET['ticket_id'])) {
<!-- Time Tracking -->
<div class="col-md-5">
<div class="form-group mb-md-0">
<div class="mb-3 mb-md-0">
<label class="text-secondary small mb-1">Time worked</label>
<div class="input-group">
<input type="text" class="form-control" inputmode="numeric" id="hours" name="hours" placeholder="Hrs" min="0" max="23" pattern="0?[0-9]|1[0-9]|2[0-3]">
<input type="text" class="form-control" inputmode="numeric" id="minutes" name="minutes" placeholder="Mins" min="0" max="59" pattern="[0-5]?[0-9]">
<input type="text" class="form-control" inputmode="numeric" id="seconds" name="seconds" placeholder="Secs" min="0" max="59" pattern="[0-5]?[0-9]">
<div class="input-group-append">
<button type="button" class="btn btn-light" id="startStopTimer" title="Start / stop timer"><i class="fas fa-play"></i></button>
<button type="button" class="btn btn-light" id="resetTimer" title="Reset timer"><i class="fas fa-redo-alt"></i></button>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<button type="submit" id="ticket_add_reply" name="add_ticket_reply" class="btn btn-success btn-block mt-3 mt-md-4">
<i class="fas fa-fw fa-paper-plane mr-2"></i>Send
<button type="submit" id="ticket_add_reply" name="add_ticket_reply" class="btn btn-success w-100 mt-3 mt-md-4">
<i class="fas fa-fw fa-paper-plane me-2"></i>Send
</button>
</div>
</div>
@@ -795,7 +793,7 @@ if (isset($_GET['ticket_id'])) {
<!-- Conversation -->
<?php if ($reply_counts['total']) { ?>
<div class="d-flex flex-wrap align-items-center mb-2 d-print-none">
<h6 class="mb-0 mr-3"><i class="fas fa-fw fa-comments mr-2"></i>Conversation</h6>
<h6 class="mb-0 me-3"><i class="fas fa-fw fa-comments me-2"></i>Conversation</h6>
<div class="btn-group btn-group-sm" id="replyFilter">
<button type="button" class="btn btn-dark active" data-reply-filter="all">All <?= $reply_counts['total'] ?></button>
<button type="button" class="btn btn-outline-dark" data-reply-filter="public">Public <?= $reply_counts['public'] ?></button>
@@ -833,30 +831,30 @@ if (isset($_GET['ticket_id'])) {
// something the client saw, so they get a label, not just a colour
if ($ticket_reply_type == 'Internal') {
$reply_border = 'dark';
$reply_badge = "<span class='badge badge-dark'><i class='fas fa-fw fa-lock mr-1'></i>Internal note</span>";
$reply_badge = "<span class='badge bg-dark'><i class='fas fa-fw fa-lock me-1'></i>Internal note</span>";
$reply_group = 'internal';
} elseif ($ticket_reply_type == 'Client') {
$reply_border = 'warning';
$reply_badge = "<span class='badge badge-warning'><i class='fas fa-fw fa-reply mr-1'></i>From client</span>";
$reply_badge = "<span class='badge bg-warning text-dark'><i class='fas fa-fw fa-reply me-1'></i>From client</span>";
$reply_group = 'public';
} else {
$reply_border = 'info';
$reply_badge = "<span class='badge badge-info'><i class='fas fa-fw fa-comment mr-1'></i>Public reply</span>";
$reply_badge = "<span class='badge bg-info text-dark'><i class='fas fa-fw fa-comment me-1'></i>Public reply</span>";
$reply_group = 'public';
}
?>
<!-- Begin ticket reply card -->
<div class="card ticket-reply border-left border-<?= $reply_border ?> mb-3" style="border-left-width: 6px !important;" data-reply-group="<?= $reply_group ?>">
<div class="card ticket-reply border-start border-<?= $reply_border ?> mb-3" style="border-start-width: 6px !important;" data-reply-group="<?= $reply_group ?>">
<div class="card-header px-3 py-2">
<div class="d-flex justify-content-between align-items-start w-100">
<div class="d-flex align-items-center">
<?php if (!empty($user_avatar)) { ?>
<img src="<?= $avatar_link ?>" alt="" class="img-size-32 mr-2 img-circle">
<img src="<?= $avatar_link ?>" alt="" class="img-size-32 me-2 img-circle">
<?php } else { ?>
<span class="fa-stack mr-2">
<span class="fa-stack me-2">
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
<span class="fa fa-stack-1x text-white"><?= $user_initials ?></span>
</span>
@@ -876,24 +874,24 @@ if (isset($_GET['ticket_id'])) {
<?php if ($can_edit_ticket) { ?>
<div class="card-tools d-print-none">
<div class="dropdown dropleft">
<button class="btn btn-sm btn-tool" type="button" data-toggle="dropdown">
<div class="dropdown dropstart">
<button class="btn btn-sm btn-tool" type="button" data-bs-toggle="dropdown">
<i class="fas fa-fw fa-ellipsis-v"></i>
</button>
<div class="dropdown-menu">
<a href="#" class="dropdown-item ajax-modal" data-modal-size="lg"
data-modal-url="modals/ticket/ticket_reply_redact.php?id=<?= $ticket_reply_id ?>">
<i class="fas fa-fw fa-pen text-danger mr-2"></i>Redact
<i class="fas fa-fw fa-pen text-danger me-2"></i>Redact
</a>
<?php if ($ticket_reply_type !== "Client" && !$ticket_is_closed) { ?>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item ajax-modal" data-modal-size="lg"
data-modal-url="modals/ticket/ticket_reply_edit.php?id=<?= $ticket_reply_id ?>">
<i class="fas fa-fw fa-edit text-secondary mr-2"></i>Edit
<i class="fas fa-fw fa-edit text-secondary me-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger confirm-link" href="post.php?archive_ticket_reply=<?= $ticket_reply_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-archive mr-2"></i>Archive
<i class="fas fa-fw fa-archive me-2"></i>Archive
</a>
<?php } ?>
</div>
@@ -914,11 +912,11 @@ if (isset($_GET['ticket_id'])) {
$ticket_attachment_name = escapeHtml($ticket_attachment['ticket_attachment_name']);
?>
<div class="mt-1">
<i class="fas fa-fw fa-paperclip text-secondary mr-1"></i><?= $ticket_attachment_name ?>
<a target="_blank" class="ml-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>&action=view">View</a>
<a class="ml-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>">Download</a>
<i class="fas fa-fw fa-paperclip text-secondary me-1"></i><?= $ticket_attachment_name ?>
<a target="_blank" class="ms-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>&action=view">View</a>
<a class="ms-2 small" href="ticket_attachment.php?attachment_id=<?= $ticket_attachment_id ?>">Download</a>
<?php if (lookupUserPermission("module_support") >= 3) { ?>
<a class="confirm-link ml-2 small text-danger" href="post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">Delete</a>
<a class="confirm-link ms-2 small text-danger" href="post.php?delete_ticket_attachment=<?= $ticket_attachment_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">Delete</a>
<?php } ?>
</div>
<?php } ?>
@@ -943,25 +941,25 @@ if (isset($_GET['ticket_id'])) {
<div class="card">
<div class="card-header px-3 py-2">
<h5 class="card-title mt-1">
<i class="fas fa-fw fa-tasks mr-2"></i>Tasks
<i class="fas fa-fw fa-tasks me-2"></i>Tasks
</h5>
<div class="card-tools">
<?php if (!$ticket_is_resolved && $can_edit_ticket && $task_count) { ?>
<div class="dropdown dropleft d-inline-block">
<button class="btn btn-tool" type="button" data-toggle="dropdown">
<div class="dropdown dropstart d-inline-block">
<button class="btn btn-tool" type="button" data-bs-toggle="dropdown">
<i class="fas fa-ellipsis-v"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item text-success" href="post.php?complete_all_tasks=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-check-double mr-2"></i>Mark All Complete
<i class="fas fa-fw fa-check-double me-2"></i>Mark All Complete
</a>
<a class="dropdown-item" href="post.php?undo_complete_all_tasks=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="far fa-fw fa-square mr-2"></i>Mark All Incomplete
<i class="far fa-fw fa-square me-2"></i>Mark All Incomplete
</a>
</div>
</div>
<?php } ?>
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<button type="button" class="btn btn-tool" data-lte-toggle="card-collapse">
<i class="fas fa-chevron-down"></i>
</button>
</div>
@@ -972,14 +970,12 @@ if (isset($_GET['ticket_id'])) {
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
<input type="hidden" name="ticket_id" value="<?= $ticket_id ?>">
<div class="form-group px-3 pt-3 mb-2">
<div class="mb-3 px-3 pt-3 mb-2">
<div class="input-group input-group-sm">
<input type="text" class="form-control" name="name" placeholder="Add a task" required maxlength="255">
<div class="input-group-append">
<button type="submit" name="add_task" class="btn btn-outline-primary">
<i class="fas fa-plus"></i>
</button>
</div>
</div>
</div>
</form>
@@ -1053,33 +1049,33 @@ if (isset($_GET['ticket_id'])) {
<?php } ?>
<?php } ?>
<span class="ml-2 <?= $task_completed_at ? 'text-muted' : 'text-dark' ?>"><?= $task_name ?></span>
<span class="ms-2 <?= $task_completed_at ? 'text-muted' : 'text-dark' ?>"><?= $task_name ?></span>
</td>
<td class="px-2 text-right text-nowrap">
<td class="px-2 text-end text-nowrap">
<div class="btn-group">
<button class="btn btn-sm btn-link drag-handle" title="Drag to reorder"><i class="fas fa-bars text-muted"></i></button>
<?php if (!$ticket_is_resolved && $can_edit_ticket) { ?>
<div class="dropdown dropleft text-center">
<button class="btn btn-light text-secondary btn-sm" type="button" data-toggle="dropdown">
<div class="dropdown dropstart text-center">
<button class="btn btn-light text-secondary btn-sm" type="button" data-bs-toggle="dropdown">
<i class="fas fa-ellipsis-v"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_task_edit.php?id=<?= $task_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
<i class="fas fa-fw fa-edit me-2"></i>Edit
</a>
<?php if (!$task_completed_at) { ?>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_task_approver_add.php?id=<?= $task_id ?>">
<i class="fas fa-fw fa-shield-alt mr-2"></i>Add Approvers
<i class="fas fa-fw fa-shield-alt me-2"></i>Add Approvers
</a>
<?php } else { ?>
<a class="dropdown-item" href="post.php?undo_complete_task=<?= $task_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-arrow-circle-left mr-2"></i>Mark incomplete
<i class="fas fa-fw fa-arrow-circle-left me-2"></i>Mark incomplete
</a>
<?php } ?>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger confirm-link" href="post.php?delete_task=<?= $task_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-trash-alt mr-2"></i>Delete
<i class="fas fa-fw fa-trash-alt me-2"></i>Delete
</a>
</div>
</div>
@@ -1104,7 +1100,7 @@ if (isset($_GET['ticket_id'])) {
if ($contact_id || $can_set_contact) { ?>
<div class="card">
<div class="card-header px-3 py-2">
<h5 class="card-title mt-1"><i class="fas fa-fw fa-user-check mr-2"></i>Contact</h5>
<h5 class="card-title mt-1"><i class="fas fa-fw fa-user-check me-2"></i>Contact</h5>
<?php if ($can_set_contact) { ?>
<div class="card-tools">
<a class="btn btn-tool ajax-modal" href="#" data-modal-url="modals/ticket/ticket_contact.php?id=<?= $ticket_id ?>" title="<?= $contact_id ? 'Change contact' : 'Set contact' ?>">
@@ -1120,39 +1116,39 @@ if (isset($_GET['ticket_id'])) {
<?php } else { ?>
<div>
<i class="fa fa-fw fa-user text-secondary mr-2"></i>
<i class="fa fa-fw fa-user text-secondary me-2"></i>
<a href="#" class="ajax-modal" data-modal-size="lg" data-modal-url="modals/contact/contact.php?id=<?= $contact_id ?>"><strong><?= $contact_name ?></strong></a>
<?php if ($contact_title) { ?><div class="text-muted small ml-4"><?= $contact_title ?></div><?php } ?>
<?php if ($contact_title) { ?><div class="text-muted small ms-4"><?= $contact_title ?></div><?php } ?>
</div>
<?php if (!empty($location_name)) { ?>
<div class="mt-2">
<i class="fa fa-fw fa-map-marker-alt text-secondary mr-2"></i><?= $location_name ?>
<i class="fa fa-fw fa-map-marker-alt text-secondary me-2"></i><?= $location_name ?>
</div>
<?php } ?>
<?php if (!empty($contact_email)) { ?>
<div class="mt-2 text-truncate">
<i class="fa fa-fw fa-envelope text-secondary mr-2"></i><a href="mailto:<?= $contact_email ?>"><?= $contact_email ?></a>
<i class="fa fa-fw fa-envelope text-secondary me-2"></i><a href="mailto:<?= $contact_email ?>"><?= $contact_email ?></a>
</div>
<?php } ?>
<?php if (!empty($contact_phone)) { ?>
<div class="mt-2">
<i class="fa fa-fw fa-phone text-secondary mr-2"></i><a href="tel:<?= $contact_phone ?>"><?= $contact_phone ?></a>
<i class="fa fa-fw fa-phone text-secondary me-2"></i><a href="tel:<?= $contact_phone ?>"><?= $contact_phone ?></a>
<?php if ($contact_extension) { ?><span class="text-muted small">ext. <?= $contact_extension ?></span><?php } ?>
</div>
<?php } ?>
<?php if (!empty($contact_mobile)) { ?>
<div class="mt-2">
<i class="fa fa-fw fa-mobile-alt text-secondary mr-2"></i><a href="tel:<?= $contact_mobile ?>"><?= $contact_mobile ?></a>
<i class="fa fa-fw fa-mobile-alt text-secondary me-2"></i><a href="tel:<?= $contact_mobile ?>"><?= $contact_mobile ?></a>
</div>
<?php } ?>
<?php if ($contact_open_tickets) { ?>
<div class="mt-2 pt-2 border-top">
<i class="fa fa-fw fa-life-ring text-secondary mr-2"></i>
<i class="fa fa-fw fa-life-ring text-secondary me-2"></i>
<a href="tickets.php?client_id=<?= $client_id ?>&state=open">
<?= $contact_open_tickets ?> other open ticket<?= $contact_open_tickets == 1 ? '' : 's' ?>
</a>
@@ -1175,34 +1171,34 @@ if (isset($_GET['ticket_id'])) {
if ($has_links || $can_link) { ?>
<div class="card">
<div class="card-header px-3 py-2">
<h5 class="card-title mt-1"><i class="fas fa-fw fa-link mr-2"></i>Linked</h5>
<h5 class="card-title mt-1"><i class="fas fa-fw fa-link me-2"></i>Linked</h5>
<div class="card-tools">
<?php if ($can_link) { ?>
<!-- Attaching things to the ticket belongs next to the things already attached -->
<div class="dropdown dropleft d-inline-block">
<button class="btn btn-tool" type="button" data-toggle="dropdown" title="Link something to this ticket">
<div class="dropdown dropstart d-inline-block">
<button class="btn btn-tool" type="button" data-bs-toggle="dropdown" title="Link something to this ticket">
<i class="fas fa-plus"></i>
</button>
<div class="dropdown-menu">
<?php if ($client_id) { ?>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_edit_asset.php?id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-desktop mr-2"></i><?= $asset_id ? 'Change Assets' : 'Add Asset' ?>
<i class="fas fa-fw fa-desktop me-2"></i><?= $asset_id ? 'Change Assets' : 'Add Asset' ?>
</a>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_edit_vendor.php?ticket_id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-building mr-2"></i><?= $vendor_id ? 'Change Vendor' : 'Add Vendor' ?>
<i class="fas fa-fw fa-building me-2"></i><?= $vendor_id ? 'Change Vendor' : 'Add Vendor' ?>
</a>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_edit_project.php?id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-project-diagram mr-2"></i><?= $project_id ? 'Change Project' : 'Add to Project' ?>
<i class="fas fa-fw fa-project-diagram me-2"></i><?= $project_id ? 'Change Project' : 'Add to Project' ?>
</a>
<div class="dropdown-divider"></div>
<?php } ?>
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/ticket/ticket_add_watcher.php?ticket_id=<?= $ticket_id ?>">
<i class="fas fa-fw fa-users mr-2"></i>Add Watcher
<i class="fas fa-fw fa-users me-2"></i>Add Watcher
</a>
</div>
</div>
<?php } ?>
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<button type="button" class="btn btn-tool" data-lte-toggle="card-collapse">
<i class="fas fa-chevron-down"></i>
</button>
</div>
@@ -1217,7 +1213,7 @@ if (isset($_GET['ticket_id'])) {
<div class="text-secondary small text-uppercase">Assets</div>
<div class="mt-1">
<a class="ajax-modal" href="#" data-modal-size="lg" data-modal-url="modals/asset/asset.php?<?= $client_url ?>&id=<?= $asset_id ?>">
<i class="fa fa-fw fa-<?= $asset_icon ?> text-secondary mr-2"></i><strong><?= $asset_name ?></strong>
<i class="fa fa-fw fa-<?= $asset_icon ?> text-secondary me-2"></i><strong><?= $asset_name ?></strong>
</a>
</div>
<?php while ($additional_asset_row = mysqli_fetch_assoc($sql_additional_assets)) {
@@ -1227,10 +1223,10 @@ if (isset($_GET['ticket_id'])) {
?>
<div class="mt-1">
<a class="ajax-modal" href="#" data-modal-size="lg" data-modal-url="modals/asset/asset.php?<?= $client_url ?>&id=<?= $additional_asset_id ?>">
<i class="fa fa-fw fa-<?= $additional_asset_icon ?> text-secondary mr-2"></i><?= $additional_asset_name ?>
<i class="fa fa-fw fa-<?= $additional_asset_icon ?> text-secondary me-2"></i><?= $additional_asset_name ?>
</a>
<?php if (!$ticket_is_closed) { ?>
<a class="confirm-link float-right" href="post.php?delete_ticket_additional_asset=<?= $additional_asset_id ?>&ticket_id=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>" title="Remove asset from ticket">
<a class="confirm-link float-end" href="post.php?delete_ticket_additional_asset=<?= $additional_asset_id ?>&ticket_id=<?= $ticket_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>" title="Remove asset from ticket">
<i class="fas fa-fw fa-times text-secondary"></i>
</a>
<?php } ?>
@@ -1241,32 +1237,32 @@ if (isset($_GET['ticket_id'])) {
<?php if ($vendor_id) { ?>
<div class="text-secondary small text-uppercase <?= $asset_id ? 'mt-3 pt-2 border-top' : '' ?>">Vendor</div>
<div class="mt-1">
<i class="fa fa-fw fa-building text-secondary mr-2"></i><strong><?= $vendor_name ?></strong>
<i class="fa fa-fw fa-building text-secondary me-2"></i><strong><?= $vendor_name ?></strong>
</div>
<?php if ($ticket_vendor_ticket_number) { ?>
<div class="mt-1"><i class="fa fa-fw fa-tag text-secondary mr-2"></i><?= $ticket_vendor_ticket_number ?></div>
<div class="mt-1"><i class="fa fa-fw fa-tag text-secondary me-2"></i><?= $ticket_vendor_ticket_number ?></div>
<?php } ?>
<?php if ($vendor_contact_name) { ?>
<div class="mt-1"><i class="fa fa-fw fa-user text-secondary mr-2"></i><?= $vendor_contact_name ?></div>
<div class="mt-1"><i class="fa fa-fw fa-user text-secondary me-2"></i><?= $vendor_contact_name ?></div>
<?php } ?>
<?php if ($vendor_email) { ?>
<div class="mt-1 text-truncate"><i class="fa fa-fw fa-envelope text-secondary mr-2"></i><a href="mailto:<?= $vendor_email ?>"><?= $vendor_email ?></a></div>
<div class="mt-1 text-truncate"><i class="fa fa-fw fa-envelope text-secondary me-2"></i><a href="mailto:<?= $vendor_email ?>"><?= $vendor_email ?></a></div>
<?php } ?>
<?php if ($vendor_phone) { ?>
<div class="mt-1"><i class="fa fa-fw fa-phone text-secondary mr-2"></i><a href="tel:<?= $vendor_phone ?>"><?= $vendor_phone ?></a></div>
<div class="mt-1"><i class="fa fa-fw fa-phone text-secondary me-2"></i><a href="tel:<?= $vendor_phone ?>"><?= $vendor_phone ?></a></div>
<?php } ?>
<?php if ($vendor_website) { ?>
<div class="mt-1 text-truncate"><i class="fa fa-fw fa-globe text-secondary mr-2"></i><?= $vendor_website ?></div>
<div class="mt-1 text-truncate"><i class="fa fa-fw fa-globe text-secondary me-2"></i><?= $vendor_website ?></div>
<?php } ?>
<?php } ?>
<?php if ($project_id) { ?>
<div class="text-secondary small text-uppercase <?= ($asset_id || $vendor_id) ? 'mt-3 pt-2 border-top' : '' ?>">Project</div>
<div class="mt-1">
<a href="project.php?project_id=<?= $project_id ?>"><i class="fa fa-fw fa-project-diagram text-secondary mr-2"></i><strong><?= $project_name ?></strong></a>
<a href="project.php?project_id=<?= $project_id ?>"><i class="fa fa-fw fa-project-diagram text-secondary me-2"></i><strong><?= $project_name ?></strong></a>
</div>
<?php if ($project_manager_name) { ?>
<div class="mt-1"><i class="fa fa-fw fa-user-tie text-secondary mr-2"></i><?= $project_manager_name ?></div>
<div class="mt-1"><i class="fa fa-fw fa-user-tie text-secondary me-2"></i><?= $project_manager_name ?></div>
<?php } ?>
<?php } ?>
@@ -1277,9 +1273,9 @@ if (isset($_GET['ticket_id'])) {
$ticket_watcher_email = escapeHtml($watcher_row['watcher_email']);
?>
<div class="mt-1 text-truncate">
<i class="fa fa-fw fa-envelope text-secondary mr-2"></i><?= $ticket_watcher_email ?>
<i class="fa fa-fw fa-envelope text-secondary me-2"></i><?= $ticket_watcher_email ?>
<?php if (!$ticket_is_closed) { ?>
<a class="confirm-link float-right" href="post.php?delete_ticket_watcher=<?= $watcher_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<a class="confirm-link float-end" href="post.php?delete_ticket_watcher=<?= $watcher_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-times text-secondary"></i>
</a>
<?php } ?>
@@ -1294,9 +1290,9 @@ if (isset($_GET['ticket_id'])) {
<!-- History - the audit trail, plus the SLA and closure detail -->
<div class="card collapsed-card">
<div class="card-header px-3 py-2">
<h5 class="card-title mt-1"><i class="fas fa-fw fa-history mr-2"></i>History</h5>
<h5 class="card-title mt-1"><i class="fas fa-fw fa-history me-2"></i>History</h5>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<button type="button" class="btn btn-tool" data-lte-toggle="card-collapse">
<i class="fas fa-chevron-up"></i>
</button>
</div>
@@ -1304,59 +1300,59 @@ if (isset($_GET['ticket_id'])) {
<div class="card-body p-3" style="display: none;">
<div>
<i class="fas fa-fw fa-calendar-alt text-secondary mr-1"></i><strong class="mr-1">Created:</strong><?= date('M d, Y • g:i A', strtotime($ticket_created_at)) ?>
<i class="fas fa-fw fa-calendar-alt text-secondary me-1"></i><strong class="me-1">Created:</strong><?= date('M d, Y • g:i A', strtotime($ticket_created_at)) ?>
<span class="text-muted small">(<?= $ticket_created_at_ago ?>)</span>
</div>
<?php if ($ticket_first_response_at) { ?>
<div class="mt-2">
<i class="fas fa-fw fa-reply-all text-secondary mr-1"></i><strong class="mr-1">1st response:</strong><?= date('M d • g:i A', strtotime($ticket_first_response_at)) ?>
<i class="fas fa-fw fa-reply-all text-secondary me-1"></i><strong class="me-1">1st response:</strong><?= date('M d • g:i A', strtotime($ticket_first_response_at)) ?>
</div>
<?php } ?>
<?php if ($ticket_sla_id && $ticket_response_due_at) { ?>
<div class="mt-2">
<i class="fas fa-fw fa-stopwatch text-secondary mr-1"></i><strong class="mr-1">Respond by:</strong><?= date('M d • g:i A', strtotime($ticket_response_due_at)) ?>
<?php if (!is_null($ticket_response_sla_met)) { echo $ticket_response_sla_met ? "<i class='fas fa-fw fa-check text-success ml-1' title='Response SLA met'></i>" : "<i class='fas fa-fw fa-exclamation-triangle text-danger ml-1' title='Response SLA missed'></i>"; } ?>
<i class="fas fa-fw fa-stopwatch text-secondary me-1"></i><strong class="me-1">Respond by:</strong><?= date('M d • g:i A', strtotime($ticket_response_due_at)) ?>
<?php if (!is_null($ticket_response_sla_met)) { echo $ticket_response_sla_met ? "<i class='fas fa-fw fa-check text-success ms-1' title='Response SLA met'></i>" : "<i class='fas fa-fw fa-exclamation-triangle text-danger ms-1' title='Response SLA missed'></i>"; } ?>
</div>
<?php } ?>
<?php if ($ticket_sla_id && $ticket_resolution_due_at) { ?>
<div class="mt-2">
<i class="fas fa-fw fa-flag-checkered text-secondary mr-1"></i><strong class="mr-1">Resolve by:</strong>
<i class="fas fa-fw fa-flag-checkered text-secondary me-1"></i><strong class="me-1">Resolve by:</strong>
<?php if ($ticket_sla_paused && $ticket_is_open) { ?>
<span class="text-warning"><i class="fas fa-fw fa-pause-circle mr-1"></i>Paused</span>
<span class="text-warning"><i class="fas fa-fw fa-pause-circle me-1"></i>Paused</span>
<?php } else { ?>
<?= date('M d • g:i A', strtotime($ticket_resolution_due_at)) ?>
<?php } ?>
<?php if (!is_null($ticket_resolution_sla_met)) { echo $ticket_resolution_sla_met ? "<i class='fas fa-fw fa-check text-success ml-1' title='Resolution SLA met'></i>" : "<i class='fas fa-fw fa-exclamation-triangle text-danger ml-1' title='Resolution SLA missed'></i>"; } ?>
<?php if (!is_null($ticket_resolution_sla_met)) { echo $ticket_resolution_sla_met ? "<i class='fas fa-fw fa-check text-success ms-1' title='Resolution SLA met'></i>" : "<i class='fas fa-fw fa-exclamation-triangle text-danger ms-1' title='Resolution SLA missed'></i>"; } ?>
</div>
<?php } ?>
<?php if ($ticket_collaborators) { ?>
<div class="mt-2">
<i class="fas fa-fw fa-users text-secondary mr-1"></i><strong class="mr-1">Worked by:</strong><?= $ticket_collaborators ?>
<i class="fas fa-fw fa-users text-secondary me-1"></i><strong class="me-1">Worked by:</strong><?= $ticket_collaborators ?>
</div>
<?php } ?>
<?php if ($ticket_resolved_at) { ?>
<div class="mt-2" title="<?= $ticket_resolved_at ?>">
<i class="fas fa-fw fa-check text-secondary mr-1"></i><strong class="mr-1">Resolved:</strong><?= date('M d, Y • g:i A', strtotime($ticket_resolved_at)) ?>
<i class="fas fa-fw fa-check text-secondary me-1"></i><strong class="me-1">Resolved:</strong><?= date('M d, Y • g:i A', strtotime($ticket_resolved_at)) ?>
<span class="text-muted small">(<?= $ticket_resolved_at_ago ?>)</span>
</div>
<?php } ?>
<?php if ($ticket_is_closed) { ?>
<div class="mt-2" title="<?= $ticket_closed_at ?>">
<i class="fas fa-fw fa-gavel text-secondary mr-1"></i><strong class="mr-1">Closed:</strong><?= date('M d, Y • g:i A', strtotime($ticket_closed_at)) ?>
<i class="fas fa-fw fa-gavel text-secondary me-1"></i><strong class="me-1">Closed:</strong><?= date('M d, Y • g:i A', strtotime($ticket_closed_at)) ?>
<span class="text-muted small">(<?= $ticket_closed_at_ago ?>)</span>
</div>
<div class="mt-2">
<i class="fas fa-fw fa-user text-secondary mr-1"></i><strong class="mr-1">Closed by:</strong><?= ucwords($ticket_closed_by_display) ?>
<i class="fas fa-fw fa-user text-secondary me-1"></i><strong class="me-1">Closed by:</strong><?= ucwords($ticket_closed_by_display) ?>
</div>
<?php if ($ticket_feedback) { ?>
<div class="mt-2">
<i class="fa fa-fw fa-comment-dots text-secondary mr-1"></i><strong class="mr-1">Feedback:</strong><?= $ticket_feedback ?>
<i class="fa fa-fw fa-comment-dots text-secondary me-1"></i><strong class="me-1">Feedback:</strong><?= $ticket_feedback ?>
</div>
<?php } ?>
<?php } ?>
@@ -1369,8 +1365,8 @@ if (isset($_GET['ticket_id'])) {
$ticket_history_created_at = escapeHtml($history_row['ticket_history_created_at']);
?>
<div class="mb-2 small">
<i class="fas fa-fw fa-angle-right text-secondary mr-1"></i><?= $ticket_history_description ?>
<div class="text-muted ml-4" title="<?= $ticket_history_created_at ?>"><?= timeAgo($ticket_history_created_at) ?></div>
<i class="fas fa-fw fa-angle-right text-secondary me-1"></i><?= $ticket_history_description ?>
<div class="text-muted ms-4" title="<?= $ticket_history_created_at ?>"><?= timeAgo($ticket_history_created_at) ?></div>
</div>
<?php } ?>
</div>