| 35626 |
amit |
1 |
/**
|
|
|
2 |
* Ticket Renderer - Handles unread indicators and ticket list rendering
|
|
|
3 |
*/
|
|
|
4 |
var TicketRenderer = (function() {
|
|
|
5 |
return {
|
|
|
6 |
/**
|
|
|
7 |
* Apply unread styling to ticket rows based on unreadMap data attribute
|
|
|
8 |
* Called after ticket list is rendered
|
|
|
9 |
*/
|
|
|
10 |
applyUnreadStyling: function() {
|
|
|
11 |
$('tr[data-ticket-unread="true"]').each(function() {
|
|
|
12 |
$(this).addClass('ticket-unread');
|
|
|
13 |
// Add unread indicator dot if not already present
|
|
|
14 |
if ($(this).find('.unread-badge').length === 0) {
|
|
|
15 |
var firstTd = $(this).find('td:first');
|
|
|
16 |
firstTd.prepend('<span class="unread-badge" title="Unread update"></span> ');
|
|
|
17 |
}
|
|
|
18 |
});
|
|
|
19 |
},
|
|
|
20 |
|
|
|
21 |
/**
|
|
|
22 |
* Sort ticket rows: unread first, then by date descending
|
|
|
23 |
* @param {string} tableBodySelector - jQuery selector for tbody
|
|
|
24 |
*/
|
|
|
25 |
sortUnreadFirst: function(tableBodySelector) {
|
|
|
26 |
var $tbody = $(tableBodySelector);
|
|
|
27 |
var rows = $tbody.find('tr').get();
|
|
|
28 |
|
|
|
29 |
rows.sort(function(a, b) {
|
|
|
30 |
var aUnread = $(a).data('ticket-unread') === true ? 1 : 0;
|
|
|
31 |
var bUnread = $(b).data('ticket-unread') === true ? 1 : 0;
|
|
|
32 |
|
|
|
33 |
// Unread first
|
|
|
34 |
if (aUnread !== bUnread) {
|
|
|
35 |
return bUnread - aUnread;
|
|
|
36 |
}
|
|
|
37 |
|
|
|
38 |
// Then by timestamp descending
|
|
|
39 |
var aTime = $(a).data('last-activity-time') || '';
|
|
|
40 |
var bTime = $(b).data('last-activity-time') || '';
|
|
|
41 |
return bTime.localeCompare(aTime);
|
|
|
42 |
});
|
|
|
43 |
|
|
|
44 |
$.each(rows, function(idx, row) {
|
|
|
45 |
$tbody.append(row);
|
|
|
46 |
});
|
|
|
47 |
},
|
|
|
48 |
|
|
|
49 |
/**
|
|
|
50 |
* Update the unread count badge in the navigation/header
|
|
|
51 |
* @param {number} count - Number of unread tickets
|
|
|
52 |
*/
|
|
|
53 |
updateUnreadBadge: function(count) {
|
|
|
54 |
var $badge = $('.cs-unread-count');
|
|
|
55 |
if (count > 0) {
|
|
|
56 |
if ($badge.length === 0) {
|
|
|
57 |
// Create badge if it doesn't exist
|
|
|
58 |
$('.cs-nav-link, .cs-menu-item').each(function() {
|
|
|
59 |
$(this).append(' <span class="badge badge-danger cs-unread-count">' + count + '</span>');
|
|
|
60 |
});
|
|
|
61 |
} else {
|
|
|
62 |
$badge.text(count).show();
|
|
|
63 |
}
|
|
|
64 |
} else {
|
|
|
65 |
$badge.hide();
|
|
|
66 |
}
|
|
|
67 |
},
|
|
|
68 |
|
|
|
69 |
/**
|
|
|
70 |
* Show last activity message preview for a ticket
|
|
|
71 |
* @param {jQuery} $row - The ticket row element
|
|
|
72 |
* @param {string} message - Last activity message
|
|
|
73 |
*/
|
|
|
74 |
showLastActivityPreview: function($row, message) {
|
|
|
75 |
if (message) {
|
|
|
76 |
var preview = message.length > 80 ? message.substring(0, 80) + '...' : message;
|
|
|
77 |
var $previewEl = $row.find('.last-activity-preview');
|
|
|
78 |
if ($previewEl.length > 0) {
|
|
|
79 |
$previewEl.text(preview);
|
|
|
80 |
}
|
|
|
81 |
}
|
|
|
82 |
}
|
|
|
83 |
};
|
|
|
84 |
})();
|
|
|
85 |
|
|
|
86 |
// Initialize when document is ready
|
|
|
87 |
$(function() {
|
|
|
88 |
// Apply unread styling after page load
|
|
|
89 |
TicketRenderer.applyUnreadStyling();
|
|
|
90 |
|
|
|
91 |
// Initialize ticket manager if on a ticket page
|
|
|
92 |
if ($('.ticket-list-table').length > 0 || $('#ticketTable').length > 0) {
|
|
|
93 |
TicketManager.init();
|
|
|
94 |
}
|
|
|
95 |
});
|