/home/edulekha/crm.edulekha.com/application/views/admin/tickets/single.php
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?>
<?php init_head(); ?>
<?php set_ticket_open($ticket->adminread, $ticket->ticketid); ?>
<div id="wrapper">
<div class="tw-h-full">
<div class="sm:tw-flex tw-h-full">
<div class="sm:tw-w-2/3">
<div class="tw-h-full">
<div
class="tw-py-4 tw-px-6 tw-bg-gradient-to-r tw-from-neutral-50 tw-to-white tw-border-b tw-border-solid tw-border-neutral-300 tw-sticky tw-top-0 tw-z-20 sm:tw-h-[61px]">
<div class="sm:tw-flex sm:tw-items-center sm:tw-justify-between sm:tw-space-x-4 rtl:tw-space-x-reverse"
id="ticketLeftInformation">
<div
class="sm:tw-flex sm:tw-items-center sm:tw-space-x-3 tw-mb-2 sm:tw-mb-0 rtl:tw-space-x-reverse">
<h3 class="tw-font-bold tw-text-lg tw-my-0 tw-max-w-full sm:tw-max-w-lg sm:tw-truncate"
title="<?= e($ticket->subject); ?>">
<span
id="ticket_subject">#<?= e($ticket->ticketid); ?>
-
<?= e($ticket->subject); ?>
</span>
</h3>
<div class="dropdown">
<a href="#"
class="dropdown-toggle single-ticket-status-label label tw-inline-flex tw-items-center tw-gap-1 tw-flex-nowrap hover:tw-opacity-80 tw-align-middle"
style="color:<?= e($ticket->statuscolor); ?>;border:1px solid <?= adjust_hex_brightness($ticket->statuscolor, 0.4); ?>;background: <?= adjust_hex_brightness($ticket->statuscolor, 0.04); ?>;"
id="ticketStatusDropdown" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<?= e(ticket_status_translate($ticket->ticketstatusid)); ?>
<i class="chevron tw-shrink-0"></i>
</a>
<ul class="dropdown-menu" aria-labelledby="ticketStatusDropdown">
<?php foreach ($statuses as $status) {
if (! is_array($status)) {
continue;
} ?>
<li>
<a href="#" class="change-ticket-status"
data-status="<?= $status['ticketstatusid']; ?>">
<?= e(ticket_status_translate($status['ticketstatusid'])); ?>
</a>
</li>
<?php } ?>
</ul>
</div>
</div>
<div class="tw-space-x-4 tw-inline-flex tw-items-center rtl:tw-space-x-reverse">
<?php if (is_ai_provider_enabled() && get_option('ai_enable_ticket_summarization') == '1') { ?>
<button class="btn btn-secondary btn-ai-summarize tw-border-0"
data-loading-text="<?= _l('wait_text'); ?>">
<i class="fa-solid fa-robot"></i>
<?= _l('ticket_summarize_ai'); ?>
</button>
<?php } ?>
<?php if (get_option('disable_ticket_public_url') == '0') { ?>
<a href="<?= get_ticket_public_url($ticket); ?>"
data-toggle="tooltip" data-placement="bottom"
data-title="<?= _l('view_public_form'); ?>"
class="tw-text-neutral-500 hover:tw-text-neutral-700 focus:tw-text-neutral-700"
target="_blank">
<i class="fa-solid fa-up-right-from-square"></i>
</a>
<?php } ?>
<?php if (can_staff_delete_ticket()) { ?>
<a href="<?= admin_url('tickets/delete/' . $ticket->ticketid); ?>"
data-toggle="tooltip" data-placement="bottom"
data-title="<?= _l('delete', _l('ticket_lowercase')); ?>"
class="tw-text-neutral-500 hover:tw-text-neutral-700 focus:tw-text-neutral-700 _delete">
<i class="fa-regular fa-trash-can"></i>
</a>
<?php } ?>
</div>
</div>
</div>
<div class="tw-pb-8 tw-pt-4 tw-px-6">
<div class="!tw-space-y-3 tw-mb-6">
<div
class="alert alert-warning staff_replying_notice<?= ($ticket->staff_id_replying === null || $ticket->staff_id_replying === get_staff_user_id()) ? ' hide' : '' ?>">
<?php if ($ticket->staff_id_replying !== null && $ticket->staff_id_replying !== get_staff_user_id()) { ?>
<p class="tw-font-medium">
<?= e(_l('staff_is_currently_replying', get_staff_full_name($ticket->staff_id_replying))); ?>
</p>
<?php } ?>
</div>
<?php if (count($merged_tickets) > 0) { ?>
<div class="alert alert-info">
<h4 class="alert-title">
<?= _l('ticket_merged_tickets_header', count($merged_tickets)) ?>
</h4>
<ul>
<?php foreach ($merged_tickets as $merged_ticket) { ?>
<a href="<?= admin_url('tickets/ticket/' . $merged_ticket['ticketid']) ?>"
class="alert-link">
#<?= $merged_ticket['ticketid'] ?>
-
<?= e($merged_ticket['subject']) ?>
</a>
<?php } ?>
</ul>
</div>
<?php } ?>
<?php if ($ticket->merged_ticket_id !== null) { ?>
<div class="alert alert-info" role="alert">
<div class="tw-flex tw-justify-between tw-items-center">
<p class="tw-font-semibold tw-mb-0">
<?= _l('ticket_merged_notice'); ?>:
<?= e($ticket->merged_ticket_id); ?>
</p>
<a href="<?= admin_url('tickets/ticket/' . $ticket->merged_ticket_id); ?>"
class="alert-link">
<?= _l('view_primary_ticket'); ?>
</a>
</div>
</div>
<?php } ?>
</div>
<div class="horizontal-scrollable-tabs tw-mb-3">
<div class="scroller arrow-left"><i class="fa fa-angle-left"></i></div>
<div class="scroller arrow-right"><i class="fa fa-angle-right"></i></div>
<div class="horizontal-tabs">
<ul class="nav nav-tabs nav-tabs-segmented nav-tabs-horizontal tw-mb-2" role="tablist">
<li role="presentation" class="active">
<a href="#addreply" aria-controls="addreply" role="tab" data-toggle="tab">
<i class="fa-solid fa-reply menu-icon"></i>
<?= _l('ticket_single_add_reply'); ?>
</a>
</li>
<li role="presentation">
<a href="#note" aria-controls="note" role="tab" data-toggle="tab">
<i class="fa-regular fa-note-sticky menu-icon"></i>
<?= _l('ticket_single_add_note'); ?>
</a>
</li>
<li role="presentation">
<a href="#tab_reminders"
onclick="initDataTable('.table-reminders', admin_url + 'misc/get_reminders/' + <?= $ticket->ticketid; ?> + '/' + 'ticket', undefined, undefined, undefined,[1,'asc']); return false;"
aria-controls="tab_reminders" role="tab" data-toggle="tab">
<i class="fa-regular fa-bell menu-icon"></i>
<?= _l('ticket_reminders'); ?>
<?php
$total_reminders = total_rows(
db_prefix() . 'reminders',
[
'isnotified' => 0,
'staff' => get_staff_user_id(),
'rel_type' => 'ticket',
'rel_id' => $ticket->ticketid,
]
); ?>
<?php if ($total_reminders > 0) { ?>
<span class="badge">
<?= $total_reminders; ?>
</span>
<?php } ?>
</a>
</li>
<li role="presentation">
<a href="#othertickets" onclick="init_table_tickets(true);"
aria-controls="othertickets" role="tab" data-toggle="tab">
<i class="fa-regular fa-life-ring menu-icon"></i>
<?= _l('ticket_single_other_user_tickets'); ?>
</a>
</li>
<li role="presentation">
<a href="#tasks"
onclick="init_rel_tasks_table(<?= e($ticket->ticketid); ?>,'ticket'); return false;"
aria-controls="tasks" role="tab" data-toggle="tab">
<i class="fa-regular fa-circle-check menu-icon"></i>
<?= _l('tasks'); ?>
</a>
</li>
<?php do_action_deprecated('add_single_ticket_tab_menu_item', $ticket, '3.0.7', 'after_admin_single_ticket_tab_menu_last_item'); ?>
<?php hooks()->do_action('after_admin_single_ticket_tab_menu_last_item', $ticket); ?>
</ul>
</div>
</div>
<div class="panel_s">
<div class="panel-body">
<div class="tab-content">
<?php $this->load->view('admin/tickets/partials/ticket-tabpanel-add-reply'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-tabpanel-notes'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-tabpanel-reminders'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-tabpanel-other-tickets'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-tabpanel-tasks'); ?>
<?php hooks()->do_action('after_admin_single_ticket_tab_menu_last_content', $ticket); ?>
</div>
</div>
</div>
<h4 class="tw-mt-6 tw-mb-4 tw-font-bold tw-text-lg">
<?= _l('ticket_request_history'); ?>
</h4>
<?php if (get_option('ticket_replies_order') !== 'desc') { ?>
<?php $this->load->view('admin/tickets/partials/ticket-history-message'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-history-replies'); ?>
<?php } else { ?>
<?php $this->load->view('admin/tickets/partials/ticket-history-replies'); ?>
<?php $this->load->view('admin/tickets/partials/ticket-history-message'); ?>
<?php } ?>
</div>
</div>
</div>
<div class="sm:tw-flex-1 sm:tw-w-1/3 tw-relative">
<div class="tw-px-6 sm:tw-px-0">
<div class="ticket-right-column tw-h-full tw-bg-white tw-overflow-y-auto tw-border ltr:sm:tw-border-l sm:tw-border-r-0 sm:tw-border-y-0 tw-border-solid tw-border-neutral-300 sm:tw-fixed sm:tw-top-[58px] tw-rounded-md sm:tw-rounded-none rtl:sm:tw-border-r"
id="ticketDetails">
<div
class="tw-py-4 tw-px-6 tw-bg-white tw-border-b tw-border-solid tw-border-neutral-300 tw-sticky tw-top-0 tw-z-20 tw-h-[59.5px] tw-flex tw-items-center tw-space-x-2 rtl:tw-space-x-reverse">
<h4
class="tw-font-bold tw-text-lg tw-my-0 sm:tw-truncate sm:tw-max-w-[240px] tw-flex tw-items-center tw-gap-x-2">
<?= _l('clients_single_ticket_information_heading'); ?>
</h4>
<a href="#" class="btn btn-primary btn-sm save_changes_settings_single_ticket">
<?= _l('submit'); ?>
</a>
</div>
<div class="tw-py-4 tw-px-6">
<?php if ($ticket->project_id) { ?>
<p class="tw-text-base tw-font-medium tw-mb-6">
<?= _l('ticket_linked_to_project', '<a href="' . admin_url('projects/view/' . $ticket->project_id) . '">' . e(get_project_name_by_id($ticket->project_id)) . '</a>'); ?>
</p>
<?php } ?>
<?php $this->load->view('admin/tickets/partials/ticket-settings'); ?>
</div> <!-- end padding -->
</div>
</div>
</div>
<?php if (count($ticket_replies) > 1) { ?>
<a href="#top" id="toplink">↑</a>
<a href="#bot" id="botlink">↓</a>
<?php } ?>
</div>
</div>
</div>
<?php if (can_staff_edit_ticket_message()) {?>
<!-- Edit Ticket Messsage Modal -->
<div class="modal fade" id="ticket-message" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog modal-lg" role="document">
<?= form_open(admin_url('tickets/edit_message')); ?>
<div class="modal-content">
<div id="edit-ticket-message-additional"></div>
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">
<?= _l('ticket_message_edit'); ?>
</h4>
</div>
<div class="modal-body">
<?= render_textarea('data', '', '', [], [], '', 'tinymce-ticket-edit'); ?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default"
data-dismiss="modal"><?= _l('close'); ?></button>
<button type="submit"
class="btn btn-primary"><?= _l('submit'); ?></button>
</div>
</div>
<?= form_close(); ?>
</div>
</div>
<?php } ?>
<?php $this->load->view('admin/tickets/partials/ai_ticket_modals'); ?>
<script>
var _ticket_message;
</script>
<?php $this->load->view('admin/tickets/services/service'); ?>
<?php init_tail(); ?>
<?php hooks()->do_action('ticket_admin_single_page_loaded', $ticket); ?>
<script>
$(function() {
var content = document.getElementById('ticketDetails');
var header = document.getElementById('header');
function makeTicketDetailsSticky() {
var scrolledPixels = getHeaderScrolledPixels();
if (scrolledPixels > 0) {
content.style.top = ((header.clientHeight + 1) - scrolledPixels) + 'px'
} else {
content.style.top = null;
}
}
function setTicketSubjectMaxWidthBasedOnFreeSpace() {
const parent = document.getElementById(
'ticketLeftInformation');
const children = parent.querySelectorAll('div');
if (children.length < 3) {
console.error('There must be at least three child divs.');
return;
}
const firstSibling = children[1];
const targetElement = children[0].firstChild.nextSibling;
const lastSibling = children[2];
const parentWidth = parent.clientWidth;
// Calculate the width of the siblings
const firstSiblingWidth = firstSibling.offsetWidth + getTotalHorizontalMargin(firstSibling);
const lastSiblingWidth = lastSibling.offsetWidth + getTotalHorizontalMargin(lastSibling);
// Calculate the max width for the target element
const maxWidth = parentWidth - firstSiblingWidth - lastSiblingWidth;
targetElement.style.maxWidth = `${maxWidth}px`;
}
if (!is_mobile()) {
setTicketSubjectMaxWidthBasedOnFreeSpace()
makeTicketDetailsSticky()
window.addEventListener('resize', setTicketSubjectMaxWidthBasedOnFreeSpace);
window.addEventListener('scroll', makeTicketDetailsSticky);
}
$('#single-ticket-form').appFormValidator();
init_ajax_search('contact', '#contactid.ajax-search', {
tickets_contacts: true
});
init_ajax_search('project', 'select[name="project_id"]', {
customer_id: function() {
return $('input[name="userid"]').val();
}
});
$('body').on('shown.bs.modal', '#_task_modal', function() {
if (typeof(_ticket_message) != 'undefined') {
// Init the task description editor
if (!is_mobile()) {
$(this).find('#description').click();
} else {
$(this).find('#description').focus();
}
setTimeout(function() {
tinymce.get('description').execCommand('mceInsertContent', false,
_ticket_message);
$('#_task_modal input[name="name"]').val($('#ticket_subject').text()
.replace(/\s+/g, ' ').trim());
}, 100);
}
});
var editorMessage = tinymce.get('message');
if (typeof(editorMessage) != 'undefined') {
var firstTypeCheckPerformed = false;
editorMessage.on('change', function() {
if (!firstTypeCheckPerformed) {
// make AJAX Request
$.get(admin_url +
'tickets/check_staff_replying/<?= e($ticket->ticketid); ?>',
function(result) {
var data = JSON.parse(result)
if (data.is_other_staff_replying === true || data
.is_other_staff_replying === 'true') {
$('.staff_replying_notice').html('<p>' + data.message +
'</p>');
$('.staff_replying_notice').removeClass('hide');
} else {
$('.staff_replying_notice').addClass('hide');
}
});
firstTypeCheckPerformed = true;
}
$.post(admin_url +
'tickets/update_staff_replying/<?= e($ticket->ticketid); ?>/<?= get_staff_user_id()?>'
);
});
$(document).on('pagehide, beforeunload', function() {
$.post(admin_url +
'tickets/update_staff_replying/<?= e($ticket->ticketid); ?>'
);
})
$(document).on('visibilitychange', function() {
if (document.visibilityState === 'visible' || (editorMessage.getContent()
.trim() !=
''))
return;
$.post(admin_url +
'tickets/update_staff_replying/<?= e($ticket->ticketid); ?>'
);
})
}
});
var Ticket_message_editor;
var edit_ticket_message_additional = $('#edit-ticket-message-additional');
function edit_ticket_message(id, type) {
edit_ticket_message_additional.empty();
// type is either ticket or reply
_ticket_message = $('[data-' + type + '-id="' + id + '"]').html();
init_ticket_edit_editor();
$('#ticket-message').modal('show');
setTimeout(function() {
tinyMCE.activeEditor.setContent(_ticket_message);
}, 1000)
edit_ticket_message_additional.append(hidden_input('type', type));
edit_ticket_message_additional.append(hidden_input('id', id));
edit_ticket_message_additional.append(hidden_input('main_ticket', $('input[name="ticketid"]').val()));
}
function init_ticket_edit_editor() {
if (typeof(Ticket_message_editor) !== 'undefined') {
return true;
}
Ticket_message_editor = init_editor('.tinymce-ticket-edit');
}
<?php if (staff_can('create', 'tasks')) { ?>
function convert_ticket_to_task(id, type) {
if (type == 'ticket') {
_ticket_message = $('[data-ticket-id="' + id + '"]').html();
} else {
_ticket_message = $('[data-reply-id="' + id + '"]').html();
}
var new_task_url = admin_url +
'tasks/task?rel_id=<?= e($ticket->ticketid); ?>&rel_type=ticket&ticket_to_task=true';
new_task(new_task_url);
}
<?php } ?>
</script>
</body>
</html>