60 lines
2.4 KiB
JavaScript
60 lines
2.4 KiB
JavaScript
async function loadMentions() {
|
|
const d=await apiGet('/api/mentions');
|
|
if(!d) return;
|
|
mentionsData = d.mentions||[];
|
|
mentionUnread = d.unread||0;
|
|
renderMentionsBell();
|
|
}
|
|
|
|
function renderMentionsBell() {
|
|
const badge=document.getElementById('notif-badge');
|
|
const btn =document.getElementById('notif-btn');
|
|
if(!badge||!btn) return;
|
|
if(mentionUnread>0){badge.textContent=mentionUnread;badge.style.display='block';}
|
|
else badge.style.display='none';
|
|
}
|
|
|
|
function toggleMentionsDropdown() {
|
|
const dd=document.getElementById('mentions-dropdown');
|
|
if(!dd) return;
|
|
const isOpen=dd.classList.contains('open');
|
|
dd.classList.toggle('open',!isOpen);
|
|
if(!isOpen) renderMentionsList();
|
|
}
|
|
document.addEventListener('click',e=>{
|
|
const dd=document.getElementById('mentions-dropdown');
|
|
if(dd&&!document.getElementById('notif-btn')?.contains(e.target)&&!dd.contains(e.target)) dd.classList.remove('open');
|
|
});
|
|
|
|
function renderMentionsList() {
|
|
const el=document.getElementById('mentions-list');
|
|
if(!el) return;
|
|
if(!mentionsData.length){el.innerHTML='<div class="mentions-empty">Нет упоминаний</div>';return;}
|
|
el.innerHTML=mentionsData.slice(0,10).map(m=>{
|
|
const unread=!m.read_at;
|
|
const task=allData.find(d=>String(d.task.id)===String(m.task_id));
|
|
const num=task?(task.task.tasknumber||task.task.id):m.task_id;
|
|
return`<div class="mention-item ${unread?'unread':''}" onclick="jumpToMention('${m.task_id}')">
|
|
<span class="m-dot ${unread?'':'read'}"></span>
|
|
<span class="m-task">#${num}</span>
|
|
<span class="m-by">↩ ${esc(m.mentioned_by)}</span>
|
|
<span class="m-time">${timeAgo(new Date(m.created_at))}</span>
|
|
</div>`;
|
|
}).join('');
|
|
}
|
|
|
|
async function jumpToMention(taskId) {
|
|
document.getElementById('mentions-dropdown')?.classList.remove('open');
|
|
STATE_CHIP_KEYS.forEach(k=>stateChips[k]=true);
|
|
['chip-reply','chip-wait','chip-resolved','chip-hidden','chip-unmarked'].forEach(id=>document.getElementById(id)?.classList.remove('inactive'));
|
|
document.getElementById('chip-all')?.classList.remove('off');
|
|
const idx=allData.findIndex(d=>String(d.task.id)===String(taskId));
|
|
if(idx!==-1){
|
|
currentPage=1; renderTable();
|
|
setTimeout(()=>{
|
|
const row=document.querySelector(`tbody tr[data-idx="${idx}"]`);
|
|
if(row) row.scrollIntoView({behavior:'smooth',block:'center'});
|
|
openDetail(idx);
|
|
},100);
|
|
}
|
|
}
|