Add comment skeleton loaders, workflow validation, monthly schedule fix
- TicketView.php: Show 3 lt-skeleton-card placeholders in the comment list
while "Load more" fetches; skeletons are removed on resolve or error
- ticket.css: Add .comment-skeleton margin spacing
- WorkflowDesignerView.php + manage_workflows.php: Prevent creating/editing
status transitions where from_status === to_status (client + server check)
- RecurringTicketsView.php: Expand monthly day picker from 28 to 31 days
(days 29-31 labelled "last day in short months")
- RecurringTicketModel.php: Clamp monthly schedule day to last day of target
month using format('t') instead of hard-capping at 28
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+24
-2
@@ -1141,10 +1141,33 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
loadMoreBtn.disabled = true;
|
||||
loadMoreBtn.textContent = 'Loading\u2026';
|
||||
|
||||
// Insert skeleton placeholders while fetching
|
||||
var list = document.getElementById('commentsList');
|
||||
var wrap = document.getElementById('loadMoreComments');
|
||||
var skeletons = [];
|
||||
for (var s = 0; s < 3; s++) {
|
||||
var sk = document.createElement('div');
|
||||
sk.className = 'lt-skeleton-card comment-skeleton';
|
||||
sk.setAttribute('aria-hidden', 'true');
|
||||
sk.innerHTML =
|
||||
'<div style="display:flex;gap:0.5rem;align-items:flex-start">' +
|
||||
'<div class="lt-skeleton lt-skeleton-avatar"></div>' +
|
||||
'<div style="flex:1">' +
|
||||
'<div class="lt-skeleton lt-skeleton-title" style="width:35%"></div>' +
|
||||
'<div class="lt-skeleton lt-skeleton-text"></div>' +
|
||||
'<div class="lt-skeleton lt-skeleton-text" style="width:75%"></div>' +
|
||||
'</div></div>';
|
||||
list.insertBefore(sk, wrap);
|
||||
skeletons.push(sk);
|
||||
}
|
||||
|
||||
var url = '/api/get_comments.php?ticket_id=' + td.ticket_id +
|
||||
'&offset=' + td.commentOffset +
|
||||
'&limit=' + td.commentPageSize;
|
||||
lt.api.get(url).then(function (data) {
|
||||
// Remove skeleton placeholders
|
||||
skeletons.forEach(function (sk) { if (sk.parentNode) sk.parentNode.removeChild(sk); });
|
||||
|
||||
if (!data.success) {
|
||||
lt.toast.error('Failed to load comments: ' + (data.error || 'Unknown error'));
|
||||
loadMoreBtn.disabled = false;
|
||||
@@ -1152,8 +1175,6 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
return;
|
||||
}
|
||||
|
||||
var list = document.getElementById('commentsList');
|
||||
var wrap = document.getElementById('loadMoreComments');
|
||||
data.comments.forEach(function (c) {
|
||||
list.insertBefore(buildCommentEl(c, td.currentUserId, td.isAdmin), wrap);
|
||||
});
|
||||
@@ -1178,6 +1199,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
});
|
||||
}
|
||||
}).catch(function (err) {
|
||||
skeletons.forEach(function (sk) { if (sk.parentNode) sk.parentNode.removeChild(sk); });
|
||||
lt.toast.error('Failed to load comments');
|
||||
loadMoreBtn.disabled = false;
|
||||
loadMoreBtn.innerHTML = 'Load more comments';
|
||||
|
||||
Reference in New Issue
Block a user